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に変換しますか?