C++ 是否将参数作为BSTR或_BSTR_t传递?

C++ 是否将参数作为BSTR或_BSTR_t传递?,c++,com,C++,Com,我的COM实现类将参数作为BSTR(和VARIANT*)并在内部传递。通常,我们将它们转换为std::string或std::wstring,但有时它们会被传递,并将被发送回另一个COM调用 在这些情况下,最好传递原始COM类型,或者将它们封装在助手类中,如\u bstr\t和\u variant\t?如果您对bstr不做任何特殊处理,而只是将其传递给另一个方法,那么您就不必封装它。您可以将BSTR视为不透明指针 _bstr_t(或VisualStudio的另一个包装提供程序CComBSTR)在

我的COM实现类将参数作为
BSTR
(和
VARIANT*
)并在内部传递。通常,我们将它们转换为
std::string
std::wstring
,但有时它们会被传递,并将被发送回另一个COM调用


在这些情况下,最好传递原始COM类型,或者将它们封装在助手类中,如
\u bstr\t
\u variant\t
如果您对bstr不做任何特殊处理,而只是将其传递给另一个方法,那么您就不必封装它。您可以将BSTR视为不透明指针

_bstr_t(或VisualStudio的另一个包装提供程序CComBSTR)在您需要分配bstr并且不想自己管理内存(并确保没有泄漏内存)时非常有用,但它们不是必需的


PS:除非我需要将BSTR输出到不懂Unicode的程序,否则我永远不会使用中介
std:string
来传递BSTR,因为我会冒丢失信息的风险<代码>标准:wstring更好。

使用_bstr\u t和_variant\u t管理分配给bstr和variant的资源。通常,通过将BSTR(可能引用系统资源)包装在自动变量_BSTR_t中,您可以通过避免取消分配资源使代码更干净,因为_BSTR_t析构函数会在超出范围时为您执行此操作。因此,问题不在于它是否传递给另一个COM调用,而在于您是否对资源负责。要详细说明这一点,您在参数中作为纯
接收的任何BSTR都完全由调用方负责。您可以将它们包装在_bstr_\t中(这将创建它们的副本),但这感觉没有必要。不过,我想变异是一个更复杂的问题。最后一条注释,
std::string
如果存储UTF-8,则可以使用。这是一种流行的在C++中处理Unicode的方法。@ M.-你是对的(虽然我认为这是个坏主意,尤其是在Windows平台上)。