6

我正在尝试将 a 转换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,比我希望的要少。进行这种转换的正确方法是什么?

4

3 回答 3

11

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

BSTR bstr = SysAllocString(pwsz);

// ...

SysFreeString(bstr);

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

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

于 2010-07-23T23:56:28.207 回答
2

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

于 2010-07-26T05:13:42.633 回答
1

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

字符串

或者

CComBSTR

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

于 2010-07-24T00:35:16.880 回答