输出不从COM互操作返回的字符串参数

时间:2011-09-30 09:53:31

标签: c# .net com com-interop

我有一个ATL COM组件方法,它有一个[out] BSTR *参数。我从我的.NET应用程序创建了对该组件的引用,该引用将该参数视为out String类型。 COM组件像这样分配这个字符串:

    USES_CONVERSION;
    *sText = SysAllocString(T2OLE(psText));

其中psText是char *

但是,当方法调用返回时,.NET代码仍然有一个空字符串。任何人都可以看到有什么问题吗?

3 个答案:

答案 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,因为outout, 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构造函数会自动应用转换。