将 _bstr_t 对象传递给期望 BSTR 作为参数的函数是不是安全?

Posted

技术标签:

【中文标题】将 _bstr_t 对象传递给期望 BSTR 作为参数的函数是不是安全?【英文标题】:Is it safe to pass a _bstr_t object to a function expecting BSTR as argument?将 _bstr_t 对象传递给期望 BSTR 作为参数的函数是否安全? 【发布时间】:2021-03-20 13:10:58 【问题描述】:

我是 C++ 新手,所以请多多包涵。我知道_bstr_t 只是BSTR 的包装类,但正如MSDN 文档中所见,_bstr_t 没有将自身转换为BSTR 的运算符。

那么我可以将_bstr_t 对象传递给期望BSTR 作为参数的函数吗?它安全吗?

或者有没有更好的方法来做到这一点?我特别不希望有任何内存泄漏。

我看过很多文章,所以对此感到困惑。对不起,如果这是一个微不足道的问题。

【问题讨论】:

【参考方案1】:

_bstr_t 没有将自身转换为 BSTR 的运算符

是和不是。 BSTR被定义为等同于“afx.h”头文件中的wchar_t*

typedef _Null_terminated_ LPWSTR BSTR;

_bstr_t 类(在“comutil.h”中)确实有用于此的转换运算符,有或没有const 限定符,如:

class _bstr_t 
public:
//...
//...
    // Extractors
    //
    operator const wchar_t*() const throw();
    operator wchar_t*() const throw();
//...

编辑:但来自documentation for those operators 的一个小“注意事项”:

为返回的指针分配一个新值不会修改 原始 BSTR 数据。

【讨论】:

那么我将 _bstr_t 对象作为参数传递而不担心任何泄漏或问题对我来说是否安全?? @RajaShekar 是的!如果函数参数应该是BSTR,则转换将完成;并且我想认为我展示的 声明 的两个运算符的 实现 将是“安全的”。

以上是关于将 _bstr_t 对象传递给期望 BSTR 作为参数的函数是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

关于使用_bstr_t的一个坑

如何将_bstr_t转换为CString

CComVariant 与 _variant_t、CComBSTR 与 _bstr_t

_bstr_t和_variant_t是怎样定义的

释放从 char* 创建的 _bstr_t

_variant_t和_bstr_t