我有一个ATL COM组件方法,它有一个[out] BSTR *参数。我从我的.NET应用程序创建了对该组件的引用,该引用将该参数视为out String类型。 COM组件像这样分配这个字符串:
USES_CONVERSION;
*sText = SysAllocString(T2OLE(psText));
其中psText是char *
但是,当方法调用返回时,.NET代码仍然有一个空字符串。任何人都可以看到有什么问题吗?
答案 0 :(得分:1)
代码没有错,但.Net运行时可能太愚蠢,无法解析间接。您可能希望从以下位置重新编写IDL:
HRESULT DoSomething([in] BSTR arg, [out] BSTR *result);
到:
HRESULT DoSomething([in] BSTR arg, [out, retval] BSTR *result);
第一种语法将在C#中产生:
string result;
void DoSomething(string arg, out result);
第二
string result = DoSomething(arg);
任何8位到16位的Unicode转换都必须通过SysAllocString,因为out
和out, retval
都要求调用者释放字符串。但是,如果告诉这是返回值,.Net运行时可能会得到更好的结果;
答案 1 :(得分:0)
如果使用UNICODE标志编译ATL COM组件,则T2OLE将不执行任何操作。如果psText确实是char *,则必须使用A2OLE来确保字符串转换为UNICODE。 .NET编组代码不支持“二进制BSTR”,即具有非UNICODE字符的BSTR。
答案 2 :(得分:0)
如果您更换了
,则不会出现CHAR / WCHAR问题*sText = SysAllocString(T2OLE(psText));
带
*sText = CComBSTR(psText).Detach();
CComBSTR构造函数会自动应用转换。