web-dev-qa-db-ja.com

LPCWSTRは何を表し、どのように処理する必要がありますか?

まず第一に、それは正確に何ですか?私はそれがポインタだと思います(LPCは長いポインタ定数を意味します)が、「W」はどういう意味ですか?文字列への特定のポインターか、特定の文字列へのポインターですか?たとえば、「TestWindow」という名前のウィンドウを閉じます。

HWND g_hTest;
LPCWSTR a;
*a = ("TestWindow");
g_hTest = FindWindowEx(NULL, NULL, NULL, a);
DestroyWindow(g_hTest);

コードは違法であり、const char [6]はCONST WCHARに変換できないため機能しません。まったくわかりません。これらすべてのLPCWSTR、LPCSTR、LPSTRを明確に理解したいと思います。何かを見つけようとしましたが、さらに混乱しました。 msdnサイトでFindWindowExは次のように宣言されています

HWND FindWindowEx(      
    HWND hwndParent,
    HWND hwndChildAfter,
    LPCTSTR lpszClass,
    LPCTSTR lpszWindow
);

したがって、最後のパラメーターはLPCSTRであり、コンパイラーはLPCWSTRを要求します。助けてください。

76
lhj7362

LPCWSTRは、「定数ワイド文字列へのロングポインタ」を表します。 WはWideを表し、文字列が通常のcharではなく2バイト文字で格納されることを意味します。非ASCIIのみの文字列を処理する必要があるC/C++コードに共通。=

通常のCリテラル文字列を取得してLPCWSTRに割り当てるには、接頭辞Lを付ける必要があります

LPCWSTR a = L"TestWindow";
117
JaredPar

LPCWSTRwchar_t const *と同等です。関数呼び出しによって変更されないワイド文字列へのポインターです。

文字列リテラルにLを追加することで、LPCWSTRsに割り当てることができます:LPCWSTR *myStr = L"Hello World";

LPCTSTRおよびその他の[〜#〜] t [〜#〜]型は、プロジェクトのUnicode設定に応じて文字列型を取ります。 _UNICODEがプロジェクトに定義されている場合、T型の使用はワイド文字形式と同じです。それ以外の場合は、Ansi形式です。適切な関数も次のように呼び出されます。FindWindowExは、この定義に応じてFindWindowExAまたはFindWindowExWとして定義されます。

10
Matt Joiner

これは、定数のワイド文字列(つまり、ワイド文字の文字列)への長いポインタです。

これは幅の広い文字列なので、定数をL"TestWindow"のようにする必要があります。中間のaも作成せず、パラメータにL"TestWindow"を渡すだけです。

ghTest = FindWindowEx(NULL, NULL, NULL, L"TestWindow");

厳密に修正したい場合、「LPCTSTR」は「テキスト」文字列です。Unicodeビルドではワイド文字列、ANSIビルドではナロー文字列です。したがって、適切なマクロを使用する必要があります。

ghTest = FindWindow(NULL, NULL, NULL, _T("TestWindow"));

ただし、UnicodeとANSIの両方の文字セット用にコンパイルできるコードの作成を気にする人はほとんどいません。実際に正しく動作しない場合は、少しの利益のためにかなりの余分な作業になる可能性があります。この特定のケースでは、余分な作業はあまりありませんが、文字列を操作している場合は、正しい関数に解決される文字列操作マクロのセット全体があります。

6
Jerry Coffin