C ++从C#COM DLL调用函数

时间:2016-02-26 01:37:32

标签: c# c++ dll com

我试图从我制作的C#DLL中调用字符串函数(以测试COM输出)。我有一个名为add的函数,它需要两个int并返回总和。这似乎有效。我的另一个函数returnString接受一个字符串并返回它。这最终会打印出空白的东西。这是代码:

C#:

public class Class1 : MyClass
{
    public string returnString(string a)
    {
        return a;
    }

    public int add(int a, int b)
    {
        return a + b;
    }
}

C ++:

int main()
{
    CoInitialize(NULL);

    MyClassPtr obj;
    obj.CreateInstance(__uuidof(Class1));

    BSTR string_result = L"\0";
    int int_result = 0;

    HRESULT hr1 = obj->returnString(L"Hello", &string_result); // should set string_result to "Hello"
    HRESULT hr2 = obj->add(5, 7, (long*)&int_result); // should set int_result to 12

    if (hr1 != S_OK)
        std::cout << "hr1: " << hr1 << std::endl;
    else{ 
        _bstr_t str(string_result);
        std::cout << str << std::endl; // prints a blank line rather than "Hello"
    }

    if (hr2 != S_OK)
        std::cout << "hr2: " << hr2 << std::endl;
    else
        std::cout << int_result << std::endl; // prints 12

    CoUninitialize();
}

这是我在定义达到顶峰时得到的结果:

virtual HRESULT __stdcall returnString (
    /*[in]*/ BSTR a,
    /*[out,retval]*/ BSTR * pRetVal ) = 0;
  virtual HRESULT __stdcall add (
    /*[in]*/ long a,
    /*[in]*/ long b,
    /*[out,retval]*/ long * pRetVal ) = 0;

那么代码有什么问题?我最近发布了一个类似的问题,发现了一点点,但我仍然无法让它表现得很好。谢谢!

1 个答案:

答案 0 :(得分:2)

问题在于:L"Hello"需要投放到CComBSTR类型。这就是结果应该是这样的:

HRESULT hr1 = obj->returnString((CComBSTR)L"Hello", &string_result);

其他一切都可以保持不变:)