如何最好地将CString转换为BSTR以将其作为"in"参数传递给COM方法?

sha*_*oth 8 windows com atl bstr visual-c++

我需要将CString实例转换为正确分配的实例并将其BSTR传递BSTR给COM方法.要拥有为ANSI和Unicode编译和工作的代码我CString::AllocSysString()用来将任何格式转换CString为Unicode BSTR.

由于没有人拥有返回的BSTR,我需要处理它并在以尽可能最安全的方式完成调用之后以尽可能少的代码完成调用.

目前我ATL::CComBSTR用于终身管理:

 ATL::CComBSTR converted;
 converted.Attach( sourceString.AllocSysString() ); //simply attaches to BSTR, doesn't reallocate it
 interface->CallMethod( converted );
Run Code Online (Sandbox Code Playgroud)

我不喜欢的是我需要两个单独的语句来构造ATL::CComBSTR转换结果的绑定.

有没有更好的方法来完成相同的任务?

Phi*_*oth 15

CComBSTR已重载两个构造char*wchar_t*,这使得调用SysAllocString()代表您.因此,您的代码段中的显式分配实际上是不必要的.以下也适用:

ATL::CComBSTR converted = sourceString;
interface->CallMethod(converted);
Run Code Online (Sandbox Code Playgroud)

此外,如果您有没有必要使用转换BSTR在代码中的其他地方,你可以在方法调用执行就地对象结构,就像这样:

interface->CallMethod(ATL::CComBSTR(sourceString));
Run Code Online (Sandbox Code Playgroud)

这同样适用于_bstr_t该类,CComBSTR如果您不希望依赖于ATL ,则可以使用该类.

  • COM的基本规则是在空BSTR和零长度BSTR之间没有语义差异.如果你调用的某个组件在两者之间有区别,那就是一个bug.有关详细信息,请参阅此答案:http://stackoverflow.com/questions/171641/should-there-be-a-difference-between-an-empty-bstr-and-a-null-bstr (2认同)
  • @Phil Booth:是的,我知道.问题是如果我只调用InvokeMethod(CComBSTR(sourceString)),被调用的方法将不知道为什么传递的BSTR为null - 因为它是指示空字符串或因为在CComBSTR构造函数内部调用SysAllocString()短缺. (2认同)