【发布时间】:2016-02-26 10:21:23
【问题描述】:
我正在尝试从我制作的 C# DLL 中调用字符串函数(以测试 COM)。我有一个名为add 的函数,它接受两个ints 并返回总和。这似乎有效。我的另一个函数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;
那么代码有什么问题?我最近发布了一个类似的问题并发现了更多信息,但我仍然无法让它正常运行。谢谢!
【问题讨论】:
-
我可以完全关闭(我不是 C#/COM 人),但是 C# 字符串可以正确映射到 BSTR 吗?在那方面,在与 C++ 之间传输内容时,通常使用字符指针,因为大多数字符串类型不翻译,COM 是否有类似的问题?
-
我自己不是 C# 人。我只是想制作一个与 C++ 兼容的 C# DLL,以便我可以帮助某人制作一个更通用/可移植的 DLL。所以我不知道。
-
在打印 unicode 时尝试
std::wcout。 -
@SHR 仍然不起作用:/
-
我发现了问题所在。我不得不将 L"Hello" 转换为 "CComBSTR",现在它打印出来了。但我会考虑标准链接,因为这似乎有点压力。