Cast to LPCWSTR?

2020-04-05 08:52发布

I'm trying to create a (very) simple Win32 GUI program, but for some reason the compiler (I'm using VC++ 2008 Express) wants me to manually typecast every string or char* to LPCWSTR:

I get this compiler error every time I do this, for example I get this error for the "Hello" and "Note":

error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [22]' to 'LPCWSTR'

Please tell me I don't have to cast every time I do this....

Here's the code:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, "Hello", "Note", MB_OK);
    return 0;
}

4条回答
何必那么认真
2楼-- · 2020-04-05 09:19

The problem is that you're building for UNICODE and are passing non-Unicode strings.

Try:

MessageBox(NULL, L"Hello", L"Note", MB_OK);

or set up your build for ANSI/MBCS or look into using TCHARs (which are a pain).

查看更多
Ridiculous、
3楼-- · 2020-04-05 09:24

My memories of Win32 C programming are hazy, but as I recall, you need to start by wrapping your string literals in this macro:

_T("mystring")

When you build unicode, this will be converted to a unicode string.

If you only build unicode, or you are sure that you are only handling a particular string in unicode, you can use the L"" marker, which is what the _T macro does under the covers.

You may need to include the tchar.h header.

When doing win32 programming, I usually declare strings as TCHAR * szWhatever so that things work on Win9x almost as well as NT/Win2k/XP. (There are other convenience macros in there as well such as the LPTSTR and so on, and MFC contains some easy conversion macros for the cases when you actually need to convert between ansi and unicode to call specific APIs).

查看更多
Deceive 欺骗
4楼-- · 2020-04-05 09:42

The default for new projects in VS2008 is to build UNICODE aware applications. You can either change that default and go back to using ANSI or MBCS apps (Properties->Configuration Properties->General->Character Set), or use Unicode Strings like this:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, L"Hello", L"Note", MB_OK);
    return 0;
}

Do not cast your strings to LPCWSTR because that will lead to undefined behavior! A char is not the same as a wchar_t!

查看更多
爱情/是我丢掉的垃圾
5楼-- · 2020-04-05 09:43

As other posts said, you are building a Unicode application. You can switch to and from Unicode project in project settings (don't forget to set it for both "Debug" and "Release" configurations.

If you want to use it, you'll have to prepend all your static strings with L:

L"Some static string"

For char[] strings there's a method mbstowcs_s, which is used roughly like this:

std::string str; // the string you want to convert

WCHAR wstr[128];
size_t convertedChars = sizeof(wstr)/sizeof(WCHAR);
mbstowcs_s(&convertedChars, wstr, str.c_str(), _TRUNCATE);

This is how I used it in one of my projects. For exact usage refer to MSDN.

查看更多
登录 后发表回答