2011-09-30 30 views
0

我有一个ATL COM组件方法有一个[out] BSTR *参数。我已经从我的.NET应用程序中创建了一个对这个组件的引用,该应用程序将该参数视为一个out字符串类型。 COM组件分配该字符串是这样的:输出字符串参数不从COM返回

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

其中psText是一个char *

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

+3

你能在这里发布完整的功能吗?它的声明和什么实际上是psText? –

+0

您使用的是哪个版本的ATL? –

+0

当psText是char *时,应该使用A2OLE()。 –

回答

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运行时可能会得到更好的结果。

+0

这没有任何区别。不过谢谢。 – Jonnster

0

如果您的ATL COM组件使用UNICODE标志进行编译,那么T2OLE将不执行任何操作。如果psText实际上是char *,则必须使用A2OLE来确保将字符串转换为UNICODE。 .NET封送处理代码不支持'binary BSTR',即带有非UNICODE字符的BSTR。

+0

它没有与UNICODE标志编译 – Jonnster

0

你不会有CHAR/WCHAR的问题,如果你有

*sText = CComBSTR(psText).Detach(); 

的CComBSTR构造函数替换您的

*sText = SysAllocString(T2OLE(psText)); 

会自动应用转换。

+0

这也没有什么区别 – Jonnster