0

Win32 APIを使用するライブラリを作成していますが、ASCIIとUnicodeの両方でコンパイルできるようにしたいと考えています(ワイド文字はtype)。内部クラス名(読み取り:WinAPI "class")を生成しています。さまざまなWindows関数の一意のクラス名を作成するために、文字列に整数を追加しています。

使用される変数の定義:

LPCTSTR lpszClassName;    //  This is char* if ASCII, wchar_t* if Unicode.
#ifdef UNICODE
std::wostringstream Convert;
#else
std::ostringstream Convert;
#endif

問題の関数:

void Base::MakeClassName () {
#ifdef _DEBUG_
    cerr << "Base::MakeClassName() called\n";
#endif
static int name_mod = 0;
name_mod++;
lpszClassName = TEXT("Win32WinNo");
Convert << lpszClassName << name_mod;
lpszClassName = Convert.str().c_str();

#ifdef _DEBUG_
    cerr << "Generated class name = " << lpszClassName << "\n";
#endif
}

ASCIIで、私は得るGenerated class name = Win32WinNo1

Unicodeでは、16進値を取得します。これは、ワイド文字wostringstreamが私が望むことをしていないことを私に示唆しています。いずれにせよ、CreateWindowはそれを気に入らないようです(プログラムがハングし、デバッグするとクラッシュします)。

私はstringstreamに100%精通しておらず、限られたドキュメントを参照すると、「string」オブジェクトが返されますが、LPCTSTRのCスタイルの文字列へのポインタが必要なので、Convert.str().c_str()。私が得ているものは正しく機能していません。RegisterClassとCreateWindowの呼び出しでTEXT( "Win32WinNo1")を試してみると、機能しますが、上から返されたこの文字列はジャンクです。

私は何が間違っているのですか?文字列に整数が追加されていないかどうかも心配です。wostringstreamは整数をwchar_tに変換しますか?

4

3 に答える 3

2

に出力しますがcerr、これはまだ狭いストリームです。ポインタ値が表示され、それが指すlpszClassName幅の広い文字列は表示されない可能性があります。

于 2012-08-13T07:30:30.817 に答える
2

ostringstream::str文字列ストリームバッファに現在関連付けられている文字列オブジェクトのコピーを返します。c_strその一時文字列の内部のバッファを指します。lpszClassNameこの一時的な文字列がスコープから外れるとすぐにダングリングポインタです。

これがおそらくプログラムがクラッシュ/ハングする理由です。

于 2012-08-13T08:04:40.537 に答える
-1

文字列リテラルを_T()で囲む必要があると思います。これにより、UNICODE設定に応じて文字列がcharsまたはsになります。wchar_t

たとえば_T("Hello World")

于 2012-08-13T07:20:23.163 に答える