2009-03-20 13 views
6

は、私は(非常に)簡単なWin32のGUIプログラムを作成しようとしていますが、何らかの理由コンパイラのために(私はVC++ 2008のExpressを使用しています)私はこれを行うたびに、このコンパイラのエラーを取得します。たとえば、 "Hello"と "Note"のエラーを受け取ります:LPCWSTRにキャストしますか?</p> <p>I:私は手動でLPCWSTRへのすべての文字列またはchar *型キャストしたい

エラーC2664: 'MessageBoxW': 'const char [22]'から ' 「LPCWSTR」

ここ

はコードだ....私はこれを行うたびにキャストする必要はありません教えてください

#include <windows.h> 

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

または単にMessageBoxA(NULL、 "Hello"、 "Note"、MB_OK)を呼び出します。 – deemok

答えて

14

VS2008の新しいプロジェクトのデフォルトは、UNICODE対応のアプリケーションを作成することです。あなたはそのデフォルトを変更し、ANSIまたはMBCSのアプリケーション(プロパティ - >構成プロパティ - >一般 - >文字セット)を使用してに戻る、または次のようにUnicodeの文字列を使用できます:はキャストではないを行い

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

をご文字列はLPCWSTRに渡されるため、未定義の動作につながります。 charはwchar_tと同じではありません!

1

問題は、ユニコード用に構築していて、非ユニコード文字列を渡していることです。

試してみてください。

MessageBox(NULL, L"Hello", L"Note", MB_OK); 

またはANSI/MBCSのためのビルドを設定したり(痛みあり)TCHAR単位を使用してに見えます。

1

Win32のCプログラミングの私の記憶はかすんでいるが、私は思い出すように、あなたはこのマクロでは、あなたの文字列リテラルをラップすることによって開始する必要があります:

_T(「のMyString」)

あなたはユニコードをビルドすると、これはユニコード文字列に変換されます。

ユニコードのみを構築している場合、またはユニコードで特定の文字列を扱っていることが確実な場合は、_ Tマクロがカバーの下にあるL ""マーカーを使用できます。

tchar.hヘッダーを含める必要があります。

私は通常、文字列をTCHAR * szWhateverと宣言しているので、Win9xでもNT/Win2k/XPと同様に動作します。 (LPTSTRなどの便利なマクロもありますが、MFCには実際にansiとunicodeの間で変換して特定のAPIを呼び出す必要がある場合に便利な変換マクロがいくつか含まれています)。

0

他の投稿によると、あなたはUnicodeアプリケーションを構築しています。プロジェクト設定でUnicodeプロジェクトとの間で切り替えることができます(「Debug」と「Release」の両方の設定に忘れずに設定してください)。

あなたがそれを使用したい場合は、Lと、すべての静的文字列を付加する必要があります:charの

L"Some static string" 

[]の文字列おおよそ次のように使用されている方法のmbstowcs_sが、あります:

std::string str; // the string you want to convert 

WCHAR wstr[128]; 
size_t convertedChars = sizeof(wstr)/sizeof(WCHAR); 
mbstowcs_s(&convertedChars, wstr, str.c_str(), _TRUNCATE); 

これは私が自分のプロジェクトの1つで使った方法です。正確な使用については、MSDNを参照してください。

関連する問題