lhj7362
lhj7362

Reputation: 2283

What does LPCWSTR stand for and how should it be handled?

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

Answers (3)

JaredPar
JaredPar

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

Jerry Coffin
Jerry Coffin

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

Matt Joiner
Matt Joiner

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

Related Questions