就地将_bstr_t转换为字符数组

Convert a _bstr_t to a char array in place

本文关键字:字符 数组 转换 bstr      更新时间:2023-10-16

我正在尝试将_bstr_t对象转换为字符数组。更具体地说,我有一个预分配的字符数组,我知道它的大小,我想在那里复制_bstr_t。

有一段时间,我的代码看起来像这样:

  bool ReadCharPtr(_bstr_t const& input, char* output, unsigned int max_len)
  {
    //  THIS CODE IS WRONG !
    const char * temp (input );
    return ::strcpy_s(output, max_len, temp) == 0;
  }

但。。。我不确定,在Windows文档中也不清楚,当我打电话给operator char*() const时会发生什么。堆中是否分配了一些东西,我以后必须取消分配?

有没有办法避免这一步,并实际将字符中的_bstr_t转换为预分配的数组?这样可以避免在堆上白白分配字符...

No.这不是必需的。文档说"运算符返回指向实际内部缓冲区的指针,因此无法修改生成的字符串",这意味着_bstr_t负责删除。

此外,您可以检查_bstr_t的实现:

在 MSVC 2010 中:

_bstr_t使用 _com_util::

ConvertBSTRToString() 从 BSTR 获取字符指针。 _com_util::ConvertBSTRToString() 文档说这需要由调用方删除。但是,_bstr_t缓存此指针并在析构函数中删除。