Home » C++ » What does LPCWSTR stand for and how should it be handled with?

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

Posted by: admin November 29, 2017 Leave a comment


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;
*a = ("TestWindow");
g_hTest = FindWindowEx(NULL, NULL, NULL, a);

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.


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";


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 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.


LPCWSTR is equivalent to wchar_t const *. It’s a pointer to a wide character string that won’t be modified by the function call.

You can assign to LPCWSTRs by prepending a L to a string literal: 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 character forms, otherwise the Ansi forms. The appropriate function will also be called this way: FindWindowEx is defined as FindWindowExA or FindWindowExW depending on this definition.