6

を に変換しようとし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、正しい長さが返されます。

_bstr_tC++ を使用している場合は、呼び出しを忘れないようにするために、RAII スタイル クラス (または Microsoft の ) の使用を検討することをお勧めしSysFreeStringます。

于 2010-07-23T23:56:28.207 に答える
2

SysStringLen()SysAllocString()ファミリ関数によって割り当てられた BSTR でのみ使用する必要があります。そのまま使用すると、未定義の動作が発生します。プログラムがクラッシュしたり、予期しない結果が生じる可能性があります。ラッパークラスを使用することをお勧めします-ATL::CComBSTRまたは_bstr_t.

于 2010-07-26T05:13:42.633 に答える
1

最も簡単なのはどちらかを使用することだと思います

CString

また

CComBSTR

両方とも、チャールズが言及したことを行うメソッドを持っています

于 2010-07-24T00:35:16.880 に答える