Reputation: 2283
First of all, what is it exactly? I guess it is a pointer (LPC means long pointer constant), but what does "W" mean? Is it a specific pointer to a string or a pointer to a specific string? For example I want to close a Window named "TestWindow".
HWND g_hTest;
LPCWSTR a;
*a = ("TestWindow");
g_hTest = FindWindowEx(NULL, NULL, NULL, a);
DestroyWindow(g_hTest);
The code is illegal and it doesn't work since const char[6] cannot be converted to CONST WCHAR.
I don't get it at all.
I want to get a clear understanding of all these LPCWSTR, LPCSTR, LPSTR. I tried to find something , however I got confused even more. At msdn site FindWindowEx
is declared as
HWND FindWindowEx(
HWND hwndParent,
HWND hwndChildAfter,
LPCTSTR lpszClass,
LPCTSTR lpszWindow
);
So the last parameter is LPCSTR, and the compiler demands on LPCWSTR. Please help.
Upvotes: 120
Views: 209849
Reputation: 755347
LPCWSTR
stands for "Long Pointer to Constant Wide String". The W stands for Wide and means that the string is stored in a 2 byte character vs. the normal char
. Common for any C/C++ code that has to deal with non-ASCII only strings.
To get a normal C literal string to assign to a LPCWSTR
, you need to prefix it with L
:
LPCWSTR a = L"TestWindow";
Upvotes: 177
Reputation: 490623
It's a long pointer to a constant, wide string (i.e. a string of wide characters).
Since it's a wide string, you want to make your constant look like: L"TestWindow"
.
I wouldn't create the intermediate a
either, I'd just pass L"TestWindow"
for the parameter:
ghTest = FindWindowEx(NULL, NULL, NULL, L"TestWindow");
If you want to be pedantically correct, an "LPCTSTR" is a "text" string -- a wide string in a Unicode build and a narrow string in an ANSI build, so you should use the appropriate macro:
ghTest = FindWindow(NULL, NULL, NULL, _T("TestWindow"));
Few people care about producing code that can compile for both Unicode and ANSI character sets though, and if you don't then getting it to really work correctly can be quite a bit of extra work for little gain. In this particular case, there's not much extra work, but if you're manipulating strings, there's a whole set of string manipulation macros that resolve to the correct functions.
Upvotes: 7
Reputation: 118670
LPCWSTR
is equivalent to const wchar_t *
. It's a pointer to a wide character string that won't be modified by the function call.
You can assign a string literal to LPCWSTR
by prepending the literal with the L
prefix, eg:
LPCWSTR myStr = L"Hello World";
LPCTSTR and any other T types, take a string type depending on the Unicode settings for your project. If UNICODE
is defined for your project, the use of T types is the same as the wide (Unicode) character forms, otherwise the narrow (Ansi) character forms. The appropriate API functions will also be called this way, eg:
FindWindowEx
is defined as FindWindowExA
or FindWindowExW
depending on this definition.
Upvotes: 19