109

まず、具体的にはどのようなものですか?ポインタだと思いますが(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 を要求します。助けてください。

4

3 に答える 3

154

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

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

LPCWSTR a = L"TestWindow";
于 2010-02-09T16:45:41.067 に答える
14

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

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

LPC T STR およびその他のT型は、プロジェクトの Unicode 設定に応じて文字列型を取ります。プロジェクトで が定義されている場合_UNICODE、T 型の使用はワイド文字形式と同じですが、そうでない場合は Ansi 形式と同じです。適切な関数も次のように呼び出さFindWindowExFindWindowExAますFindWindowExW

于 2010-02-09T17:00:30.393 に答える
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の両方の文字セット用にコンパイルできるコードを作成することに関心を持つ人はほとんどいません。実際に正しく機能しない場合は、少しの利益のためにかなりの余分な作業が必要になる可能性があります。この特定のケースでは、余分な作業はそれほど多くありませんが、文字列を操作している場合は、正しい関数に解決される文字列操作マクロのセット全体があります。

于 2010-02-09T16:49:39.147 に答える