0

「Introduction to 3D Game Programming with DirectX 9.0c: A Shader Approach」という本を読んでいて、そこのコードに従っていましたが、アプリケーションはマルチバイト文字セットを使用しており、どこかから読むのは良い習慣ではありません。それを使用すると、ウィンドウを作成するときにエラーが発生します。これは、エラーが発生したコードです。

mhMainWnd = CreateWindow(L"D3DWndClassName", mMainWndCaption.c_str(), WS_OVERLAPPEDWINDOW, 
            GetSystemMetrics(SM_CXSCREEN)/2 - width/2, 
            GetSystemMetrics(SM_CYSCREEN)/2 - height/2,
            R.right, R.bottom, 0, 0, mhAppInst, 0); 

エラーは次のとおりです。

error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'const char [16]' to 'LPCWSTR'

誰かが私を助けてくれることを願っています

4

2 に答える 2

1

ANSI/MBCS よりも Unicode の方が好まれるというあなたの聞いたことは完全に正しいです。すべての新しい Windows コードは、Unicode で動作するように作成する必要があります。これを実現するには、次の 2 つのことを確認する必要があります。

  1. UNICODE_UNICODEWサフィックスを忘れた場合でも、API 関数の Unicode バージョンが確実に呼び出されるように、シンボルとシンボルの両方をグローバルに定義する必要があります。

    プリコンパイル済みヘッダーの上部でこれを行うことができます

    #define UNICODE
    #define _UNICODE
    

    または、Visual Studio 内のプロジェクトの [プロパティ] ウィンドウで。両方の値をリストに追加するだけです。

  2. すべての文字列 (リテラルとそれ以外の両方) は Unicode 文字列である必要があります。

    リテラルでは、例で行ったように、L をプレフィックスとして付けることでこれを実現します。L"D3DWndClassName"

    wchar_t実行時に割り当てられる文字列では、型を使用する必要があります。C++ を使用しているため、C のように生の文字配列ではなく、明らかに文字列クラスを使用する必要があります。そのため、文字列内の文字を として扱う文字列クラスを使用する必要がありますwchar_t。これは、std::wstringまたは MFC/ATL/WTL のCStringWクラスのいずれかになります。

あなたはすでにこのほとんどを手に入れたようです。犯人はmMainWndCaption.c_str()std::string(nul で終わるchars の配列を返す) の代わりにstd::wstring(nul で終わる s の配列を返す)を使用していますwchar_t

于 2013-05-11T07:48:11.397 に答える
0

プロジェクトを UNICODE ではなく ANSI または MBCS に変更してから、

L"D3DWndClassName"

"D3DWndClassName"

または、プロジェクトのプロパティを UNICODE のままにして、ウィンドウ キャプションの UNICODE 文字列を使用します。

CString szCaption(mMainWndCaption.c_str());   // CString is actually CStringW in UNICODE build

mhMainWnd = CreateWindow(L"D3DWndClassName", szCaption, WS_OVERLAPPEDWINDOW, 
            GetSystemMetrics(SM_CXSCREEN)/2 - width/2, 
            GetSystemMetrics(SM_CYSCREEN)/2 - height/2,
            R.right, R.bottom, 0, 0, mhAppInst, 0); 
于 2013-05-11T06:20:55.203 に答える