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


91

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

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

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

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

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


59
Microsoftハンガリアン記法へようこそ。
トーマスマシューズ

2
それは実際にははるかに読みやすいドキュメントになり、それに関する他のすべてを残念に思います。
マットジョイナー2010

1
@Thomas:これは、Microsoft(またはそのことについてはSimonyi)が最初にハンガリアン記法にタグを付けたものではありません。ドキュメントグループが「読みやすさ」の改善を行うことを決定したとき、それは多かれ少なかれ事故の結果です。彼らは開発者ではなかったため、変更は適切ではありませんでした。背景情報はハンガリー語表記で入手できます-今度は私の番です:)
IInspectable 2014年

@IInspectable:リンク切れ
Nicolas Raoul

回答:


137

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

に割り当てる通常のCリテラル文字列を取得するにはLPCWSTR、プレフィックスとしてLを付ける必要があります。

LPCWSTR a = L"TestWindow";

8
拡張するだけです-「LONG」の部分は16ビットウィンドウからの二日酔いであり、無視できます(名前に必要な例外)
Martin Beckett

14
「16ビットWindowsからの二日酔い」-それは確かです!
ジョンダイブリング2010

4
いいえ、その通りです。32ビットポインタでした。「短い」16ビットポインタはもうないので、なんとか見つけたら文句を言うかもしれませんSPCWSTR
MSalters 2010

50
我が神よ。L ??? 文字L?関数でもない、L()?ただのL?一体誰がそれを思いついたのですか?
john ktejik 2013年

12
@ user396483多くの言語では、定数に接頭辞と接尾辞を追加して、人間にとっての意味を変えずに、それらの表現方法を変更するのが一般的です。たとえば36UL、C#では(ulong)36(符号なし64ビット整数である)と同じです。 @文字列のプレフィックスと同じ言語で使用でき、文字列の解析方法をわずかに変更します。
Zenexer 2013

12

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

LPCWSTR文字列リテラルの前にLを付けることで、sに割り当てることができます。LPCWSTR *myStr = L"Hello World";

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


7

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

幅の広い文字列なので、定数を次のように表示しますL"TestWindow"。中間体aも作成せずL"TestWindow"、パラメーターを渡すだけです。

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

根本的に正しくしたい場合、「LPCTSTR」は「テキスト」文字列です。Unicodeビルドでは幅の広い文字列であり、ANSIビルドでは幅の狭い文字列であるため、適切なマクロを使用する必要があります。

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

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


1
厳密に修正する必要はありません。_T(MAIN_WINDOW)などの定数を使用している場合は_T()を使用してください。そうでない場合、LMAIN_WINDOWは失敗します。
ロドルフォ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.