我有一个ATL COM组件方法有一个[out] BSTR *参数。我已经从我的.NET应用程序中创建了一个对这个组件的引用,该应用程序将该参数视为一个out字符串类型。 COM组件分配该字符串是这样的:输出字符串参数不从COM返回
USES_CONVERSION;
*sText = SysAllocString(T2OLE(psText));
其中psText是一个char *
然而,当该方法调用返回时,.NET代码仍然有一个空字符串。任何人都可以看到什么是错的?
我有一个ATL COM组件方法有一个[out] BSTR *参数。我已经从我的.NET应用程序中创建了一个对这个组件的引用,该应用程序将该参数视为一个out字符串类型。 COM组件分配该字符串是这样的:输出字符串参数不从COM返回
USES_CONVERSION;
*sText = SysAllocString(T2OLE(psText));
其中psText是一个char *
然而,当该方法调用返回时,.NET代码仍然有一个空字符串。任何人都可以看到什么是错的?
代码没有错,但.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运行时可能会得到更好的结果。
这没有任何区别。不过谢谢。 – Jonnster
如果您的ATL COM组件使用UNICODE标志进行编译,那么T2OLE将不执行任何操作。如果psText实际上是char *,则必须使用A2OLE来确保将字符串转换为UNICODE。 .NET封送处理代码不支持'binary BSTR',即带有非UNICODE字符的BSTR。
它没有与UNICODE标志编译 – Jonnster
你不会有CHAR/WCHAR的问题,如果你有
*sText = CComBSTR(psText).Detach();
的CComBSTR构造函数替换您的
*sText = SysAllocString(T2OLE(psText));
会自动应用转换。
这也没有什么区别 – Jonnster
你能在这里发布完整的功能吗?它的声明和什么实际上是psText? –
您使用的是哪个版本的ATL? –
当psText是char *时,应该使用A2OLE()。 –