我需要将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 );

我在这里不喜欢的是,我需要两个单独的语句来构造绑定(bind)到转换结果的ATL::CComBSTR

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

最佳答案

CComBSTR已重载了char*wchar_t*的构造函数,它们代表您进行了对SysAllocString()的调用。因此,实际上不需要在代码片段中进行显式分配。以下内容同样适用:

ATL::CComBSTR converted = sourceString;
interface->CallMethod(converted);

此外,如果您不需要在代码的其他地方使用转换后的BSTR,则可以在方法调用中就地执行对象构造,如下所示:
interface->CallMethod(ATL::CComBSTR(sourceString));
_bstr_t类也是如此,如果您不想依赖ATL,可以使用CComBSTR类代替ojit_code。

10-05 23:01