私は次のc ++コードを持っていますが、文字列を配置しようとするあらゆる場所で、「Canst conver parameter 2 from "const char [x] to LPCWSTR。」を回避するために文字列を変換する必要があります。単純な変換を行うことでこの問題を解決できることがわかっていますが、私が提供するすべての文字列を変換する必要がありますか?私はC ++を学習しているc#開発者なので、言語の基本的な概念が欠落していると推測します。誰かがこれに光を当てることができれば、感謝します!
#include <Windows.h>
#include <string>
using namespace std;
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR cmdLine,
int showCmd)
{
MessageBox(0, "First Win32 Program.", "My App", MB_OK);
}
これよりも良い解決策はありますか:
{
MessageBox(0, (LPCWSTR)"First Win32 Program.", (LPCWSTR)"My App", MB_OK);
}
そして、なんらかの奇妙な理由で、私の申請書が日本語または中国語で作成されています。これで負けました。
回答:
回答№1は2つかいます L"text"
文字列を作成します。このようにして、WinAPIから予想される可能性が高いワイド文字列を作成しています。
#include <Windows.h>
#include <string>
using namespace std;
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR cmdLine,
int showCmd)
{
MessageBox(0, L"First Win32 Program.", L"My App", MB_OK);
}
問題は、「Cスタイルのキャストを使用して、狭い文字列を挿入しています」 LPCWSTR
。したがって、2つのナロー文字(各8ビット)は、1つのUNICODE文字(各16ビット)で混同されます。
回答№2の場合は1
あなたは L
リテラルのプレフィックス。 WINAPIは主にワイド文字列で機能します。
その接頭辞が機能する理由については、「標準の関連部分(§2.14.5/ 11)」を参照してください。
次のようなLで始まる文字列リテラルL "asdf"は、ワイド文字列リテラルです。ワイド文字列リテラルの型は 「n const wchar_tの配列」。nは、以下で定義する文字列のサイズです。静的な保存期間があります 指定された文字で初期化されます。
ガベージが発生するのは、「何も意味を持たないキャストを行っている」ためであり、ライブラリがワイド文字列として解釈しようとするガベージデータになります。
確かに、ここに「何 LPCWSTR
:
typedef const wchar_t* LPCWSTR;