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