1

重複の可能性:
単純なC ++ GUIアプリケーションで中国語のメッセージボックスが表示されるのはなぜですか?

このコードブロックは、以下のようにVisualC++で実装しました。

int nResult=MessageBox(NULL,
                       (LPCWSTR)"An example of Cancel,Retry,Continue",
                       (LPCWSTR)"Message Box!",
                        MB_ICONWARNING|MB_ABORTRETRYIGNORE);

ただし、何を試しても、常に中国語のメッセージボックスが表示されます。したがって、私は自分の問題の解決策と、なぜここに中国語のメッセージがあるのか​​を尋ねたいと思います。ありがとうございます!

4

3 に答える 3

10

文字列リテラルの前に「L」を配置するのを忘れました。次のように変更します。

int nResult=MessageBox(NULL,
                   L"An example of Cancel,Retry,Continue",
                   L"Message Box!",
                   MB_ICONWARNING|MB_ABORTRETRYIGNORE);

C ++では、Unicode文字列リテラルの前に。が付きLます。プレフィックスを付けないと、「unicode文字列定数」にキャストしても効果がなく、メモリ位置の誤った解釈が発生します。

于 2012-05-27T03:14:14.743 に答える
5

あるタイプから別のタイプへのポインターのキャストが、ポイントされた値を変更することを期待しています。これは、C++キャストが行うことではありません。それらは、ポインタが新しい型を指していると想定するようにコンパイラに指示するだけです。ワイドリテラルを指定するLには、引用符の前に使用します(コンパイラがサポートしている場合は新しい文字列リテラル)。そしてキャストを取り除く、それはただバグを覆い隠しているだけです。

于 2012-05-27T03:13:22.437 に答える
4

Davidが言ったように、ASCII文字列をUNICODE文字列にキャストしました。代わりに_TEXT( "Your string")マクロを使用してください。

ASCIIバイトをUNICODE文字列として解釈することはできません。そうしないと、悪いことが起こります。

編集:また、ASCII文字列が必要な場合は、MessageBoxA()を明示的に呼び出すか、プロジェクト設定でマルチバイト文字設定に変更できます。

于 2012-05-27T03:15:26.230 に答える