1

私は問題があります。ツールの開発を記録したかったので、スクリーンショットの上に日付を mspaint する代わりに、ウィンドウ名に日付と時刻のデータを持たせたいと思いました。しかし、文字列の代わりに漢字しかありません。

ちんぷんかんぷん

文字列を CreateWindowEx() に割り当てたいコードは次のとおりです。

char *wndName = "Asphyx V0.01 (Build Date: " __DATE__ " " __TIME__ ")\0";

hWnd = CreateWindowEx(NULL,
                      L"WindowClass",
                      (LPCWSTR)wndName,
                      WS_OVERLAPPEDWINDOW,
                      300,
                      300,
                      wr.right - wr.left,
                      wr.bottom - wr.top,
                      NULL,
                      NULL,
                      hInstance,
                      NULL);

編集:みんな、あなたの答えに感謝しますが、彼ら全員が私にこれを与えます

Error 29 error C2308: concatenating mismatched strings  

やや機能しているのは、まだ削除された回答だけでしたが、次のようになりました。

ここに画像の説明を入力

彼はこのコードを使用しました:

char title[256];
sprintf(title, "Asphyx V0.01 (Build Date:  %s - %s)", __DATE__, __TIME__);

hWnd = CreateWindowEx(NULL,
                      L"WindowClass",
                      title,
                      WS_OVERLAPPEDWINDOW,
                      300,
                      300,
                      wr.right - wr.left,
                      wr.bottom - wr.top,
                      NULL,
                      NULL,
                      hInstance,
                      NULL);
4

2 に答える 2

5

標準によれば、文字列の 1 つにエンコーディング プレフィックスがある場合、そうでない残りの文字列は同じプレフィックスを持つものとして扱われます。

これは、Visual Studio には当てはまりません。バグです。

Lワイド文字列を使用し、マクロを含めてすべての文字列リテラルにプレフィックスを付ける必要があります。

#define WSTR2( s ) L##s
#define WSTR( s ) WSTR2( s )

wchar_t *wndName = L"Asphyx V0.01" WSTR(__DATE__) L" " WSTR(__TIME__) L")";
于 2014-12-22T10:44:01.830 に答える
1

問題は、char を LPCWSTR に変換するためにキャストを使用しているためです。

char *wndName = "Asphyx V0.01 (Build Date: " __DATE__ " " __TIME__ ")\0";

 wchar_t *wndName = L"Asphyx V0.01 (Build Date: " __DATE__ " " __TIME__ ")";

これで、CreateWindowEx の 2 番目のパラメーターでこれ以上キャストする必要がなくなりました。

wchar_t *wndName = L"Asphyx V0.01 (Build Date: " __DATE__ " " __TIME__ ")";

hWnd = CreateWindowEx(NULL,
                  L"WindowClass",
                  wndName,
                  WS_OVERLAPPEDWINDOW,
                  300,
                  300,
                  wr.right - wr.left,
                  wr.bottom - wr.top,
                  NULL,
                  NULL,
                  hInstance,
                  NULL);
于 2014-12-22T10:31:27.057 に答える