【问题标题】:C++: Convert wchar_t* to BSTR?C++:将 wchar_t* 转换为 BSTR?
【发布时间】:2023-03-14 14:38:01
【问题描述】:

我正在尝试将 wchar_t * 转换为 BSTR

#include <iostream>
#include <atlstr.h>

using namespace std;

int main()
{
    wchar_t* pwsz = L"foo"; 

    BSTR bstr(pwsz);

    cout << SysStringLen(bstr) << endl;

    getchar();
}

这会打印出0,这比我希望的要少。进行这种转换的正确方法是什么?

【问题讨论】:

    标签: c++ string com bstr


    【解决方案1】:

    您需要使用 SysAllocString(然后是 SysFreeString)。

    BSTR bstr = SysAllocString(pwsz);
    
    // ...
    
    SysFreeString(bstr);
    

    BSTR 是一个托管字符串,字符串中的字符以其长度为前缀。 SysAllocString 分配正确的存储量并正确设置字符串的长度和内容。正确初始化 BSTR 后,SysStringLen 应该返回正确的长度。

    如果您使用 C++,您可能需要考虑使用 RAII 样式类(甚至是 Microsoft 的 _bstr_t),以确保您不会忘记任何 SysFreeString 调用。

    【讨论】:

      【解决方案2】:

      我认为最简单的方法是使用

      CString

      CComBSTR

      两者都有查尔斯提到的方法

      【讨论】:

      • CString 不会包装 BSTR,尽管它有一种从CString (.AllocSysString()) 分配BSTR 的方法。不过,CString 无助于自动释放 BSTR
      • 从某种意义上说,它包含了转换为 OP 想要的 BSTR 的功能,但从技术上讲,您是正确的,所以我的用词不正确。
      【解决方案3】:

      SysStringLen() 只能用于由SysAllocString() 系列函数分配的 BSTR。像你一样使用它会导致未定义的行为 - 程序可能会崩溃或产生意想不到的结果。最好使用包装类 - ATL::CComBSTR_bstr_t

      【讨论】:

        猜你喜欢
        • 2018-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-08
        • 2010-09-15
        • 2013-05-12
        • 1970-01-01
        • 2017-12-12
        相关资源
        最近更新 更多