none
PCWSTRからLPCSTRへの変換 RRS feed

  • 質問

  • C++でのプログラムを書いているのですが

    以下のプログラムでエラーを吐きます。

     // Create the application window.

    hwnd = CreateWindow(szWindowClass, TEXT(L"   "), WS_OVERLAPPEDWINDOW,         CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, NULL, NULL);

    エラー C2664 'HWND CreateWindowExA(DWORD,LPCSTR,LPCSTR,DWORD,int,int,int,int,HWND,HMENU,HINSTANCE,LPVOID)': 引数 2 を 'PCWSTR' から 'LPCSTR' へ変換できません。

    というエラーは吐きます。このエラーを治すためにプロパティのすべての構成ですべてのプラットフォームで文字セットをマルチバイトにしてもかわらずにこのエラーを吐きます。

    なにかほかに修正する方法はありますか?



    2018年12月29日 2:36

すべての返信

  • TEXTマクロを使うならL接頭辞を付けてはいけません。

    というか、L接頭辞を付けるか付けないかをコンパイラ側に任せるのがTEXTマクロです。わざわざプログラム側でL接頭辞を付けたら台無しです。

    2018年12月29日 2:41
  • あ、すいません!

    hwnd = CreateWindow(szWindowClass, L"", WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, NULL, NULL);

    上記のようにL""でもエラーになってしまいます

    2018年12月29日 3:07
  • マルチバイト文字セットではCreateWindowAが呼ばれますが、CreateWindowAにL接頭辞付き文字列(=ワイド文字列)を渡すことはできません。

    なぜそんなにL接頭辞にこだわるのでしょうか?

    2018年12月29日 3:16
  • このエラーを治すためにプロパティのすべての構成ですべてのプラットフォームで文字セットをマルチバイトにしてもかわらずにこのエラーを吐きます。

    目指しているのは何ですか?

    マルチバイト文字セットで作りたいなら、すでに指摘されているとおり、L をつけてはいけません。
    Unicode 文字セットで作りたいなら、文字セットをマルチバイトにするのではなく、Unicode 文字セットに戻して、L をつけてください。
    プロジェクトの設定に応じて、マルチバイト文字セット・Unicode 文字セットの両方に対応できるソースコードを書きたいなら、TEXT マクロを使ってください。(L をつけてはいけません)


    (エラーを修正するために文字セットを変更する…というのが誤解の始まりです。エラーで検索して適当に試すことはやめた方が良いです。C/C++ は特に、試行錯誤で作るものではない ので…)
    2018年12月29日 8:11
    モデレータ
  • マルチバイトで使いたいのであれば、 L"" ではなく、"" または TEXT("") とする必要があります。
    リテラル文字列で固定するのなら、将来UNICODE/ANSIのどちらに切り替えても都合が悪くならないように TEXT("") とするのが良いと思います。

    具体的にはこんな感じですね。

    hwnd = CreateWindow(szWindowClass, TEXT(""), WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, NULL, NULL);



    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2018年12月30日 12:45