2011-02-02 2 views
0

私は次の簡単なメッセージボックスアプリケーションを使い始めています。問題は、このアプリケーションを実行するとテキストが中国語であることです。私は明らかにエンコードの問題があります。誰かがどこかに私がWindows.hの特定の文字列typedefについて知ることができるかどうかを教えてもらえますか?私の頭をwindows.hの周りに置く - const char *対LPSTR

//test.c

#include <windows.h> 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 
{ 
    MessageBox(NULL, "Hello World", "Note", MB_OK); 
    return 0; 
} 
+0

もし 'UNICODE'が定義されていれば、Laserallanの答えにあなたのコメントが示唆するように、これは決してコンパイルされてはいけません。 'const char *'から 'const wchar_t *'への変換に関連したエラーが発生しているはずです。 –

+0

私の推測では、.cppファイルではなく.cファイルである可能性があります。また、cコンパイラは、タイプエラーになるとややリベラルです。 – Laserallan

+0

申し訳ありませんが、私はそれを言及すべきでした。これは.cファイルです – Nick

答えて

0

これは、最も可能性の高い通常のchar型の問題VSワイド文字です。

#include <windows.h> 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 
{ 
    MessageBox(NULL, L"Hello World", L"Note", MB_OK); 
    return 0; 
} 

これが問題を解決すれば、プロジェクトが通常の文字ではなくワイド文字に設定されていることを意味します。文字列定数の前にLを追加すると、ワイド文字定数になります。これは一般に、ワイド文字アプリケーションの国際化を管理する方が簡単なので、良いことです。

これらのウェブページは、より詳細に、WindowsのAPIとUnicodeを取り上げます。

http://msdn.microsoft.com/en-us/library/ff381407(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/dd374089(v=vs.85).aspx

+0

ありがとうございました問題を解決します。 – Nick

+2

これはまったく正しいことではありません。 'UNICODE = 1'のために構築されたアプリケーションは' wWinMain'を使うべきです。 –

0
#include <windows.h> 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 
{ 
    MessageBox(NULL, _T("Hello World"), _T("Note"), MB_OK); 
    return 0; 
} 

問題は、UNICODEアプリケーションを構築するとポインタを渡している可能性が最も高いですAPIがwchar_t文字列へのポインタを必要とするときにchar文字列に変換する

+1

これはまだ正しくはありません.MBCSまたはUnicode用にコンパイルするためのソースコードは、 '_tWinMain'を使用する必要があります。 –

+0

真。 L ""の代わりに_T()マクロを使用しました。なぜなら、Microsoftが生成したコードではLよりも_Tに遭遇する確率がはるかに高いからです。 –

3

Windows APIを使用する場合(ほとんど)ヌル終端文字列を含むすべての宣言を使用すると、文字セット としてUNICODEとない構築しているとwchar_twchar_t*const wchar_t*あなたのように定義されている場合charchar*const char*として定義されているTCHARLPTSTRLPCTSTRを使用していますUNICODE文字セットで構築しています。

また、windows-API関数を呼び出すときに関数がコンパイルされているという意味で、UNICODEおよび/または_UNICODEの定義があります。ほぼすべての機能には、UNICODE用とUNICODE用の2つのバージョンがあります。

たとえばMessageBoxはMessageBoxA(非UNOCODEバージョン)またはMessageBoxW(UNOCDEバージョン)に変換されます。

さらにより:_あなたのために右の翻訳を持つ<tchar.h>を含める必要があり、最後のバージョンの

int WINAPI _tWinMain (HINSTANCE hInstance ,HINSTANCE hPrevInstance ,LPTSTR lpCmdLine ,int nCmdShow) 
{ 
// ... 
} 

tWinMain(または_ tmain構築consleを:

int WINAPI WinMain (HINSTANCE hInstance ,HINSTANCE hPrevInstance ,LPSTR lpCmdLine, int nCmdShow) 
{ 
// ... 
} 

は、多くの場合のように定義されます-app)。

このClarefiesものをあなたのために。

+0

VSは、このプロジェクトをデフォルトでUnicodeに設定された文字タイプで構築するように設定されています。私はこれを残して、文字列リテラルの先頭にLを付けますか? – Nick

+0

UNICODE用にビルドするときにLを配置する_T(...)マクロを使用できます。 UNICODEを使用すべきかどうかは別の質問です。私は確かに答えられません(私はそれを使用しますが、なぜか分かりません)。 –

+0

@Nick、マルチバイト文字のためにコンパイルする必要がないことが分かっているなら、 –

関連する問題