ここでの問題は Win32TCHAR
モデルです。
実際にはMessageBox
関数はありません:プロジェクト設定 (それぞれ ANSI/MBCS または Unicode) に基づいてまたはに展開されるMessageBox
プリプロセッサです。 #define
MessageBoxA
MessageBoxW
VS2005 以降、Visual Studioの既定の設定はUnicode (より正確にはUTF-16 ) です。したがって、MessageBoxW
この場合、API (つまり Unicode バージョン) はコンパイラによって選択されます。
MessageBoxW
API は、ポインターを介して表されるUnicode (UTF-16) 文字列wchar_t
を取ります (あいまいなLPCWSTR
プリプロセッサ マクロは に展開されますconst wchar_t*
。つまり、終了するNUL
C スタイルの Unicode UTF-16 文字列)。
Unicode (UTF-16) 文字列リテラルは、構文を使用して表されます (接頭辞 LL"..."
に注意してください)。
したがって、 whileは ANSI 文字列リテラルであり、 は Unicode (UTF-16) 文字列リテラルです。
"Test_text"
L"Test_text"
(暗黙のうちに、Visual Studio のデフォルト設定を介して) Unicode ビルドを行っているため、文字列リテラルをL プレフィックスで装飾する必要があります。
MessageBox(nullptr, // <--- prefer nullptr to NULL in modern C++ code
L"Test_text", // <--- Unicode (UTF-16) string literal
L"Message Test", // <--- Unicode (UTF-16) string literal
MB_ICONINFORMATION | MB_OKCANCEL);
_T("...")
別の方法は、またはTEXT("...")
マクロを使用して文字列リテラルを修飾することです。これらは"..."
、ANSI/MBCS ビルドでは単純な ANSI 文字列リテラルに拡張されL"..."
、Unicode ビルドでは Unicode (UTF-16) 文字列リテラルに拡張されます (Visual Studio の最新バージョンでは既定です)。
// TEXT("...") works in both ANSI/MBCS and Unicode builds
MessageBox(nullptr,
TEXT("Test_text"),
TEXT("Message Test"),
MB_ICONINFORMATION | MB_OKCANCEL);
個人的には、TCHAR モデルは過去の時代遅れのモデルだと考えています (最新の C++ Win32 アプリケーションの ANSI ビルドを作成する理由はないと思います)。また、最新の Windows API は Unicode のみ (たとえばDrawThemeText()
) であることを考えると、文字列リテラルを装飾するだけです。接頭辞を使用しL"..."
、ANSI ビルドを忘れてしまいます。