开发者

Wrapping my head around windows.h - const char* vs LPSTR

I am getting started with the following simple messagebox application. The problem is that when I run this application the text is Chinese. I clearly have an encoding issue. Can someone point me to somewhere I can learn about windows.h specifi开发者_如何学运维c string typedefs?

//test.c

#include <windows.h>

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


When using the windows API (almost) every declaration with null-terminated strings uses TCHAR ,LPTSTR and LPCTSTR which are define as char ,char* and const char* when you're not building with UNICODE as character-set and are defined as wchar_t ,wchar_t* and const wchar_t* when you are building with the UNICODE character-set.

Also the UNICODE and/or _UNICODE definition(s) controll which function is being compiled when you call an windows-API function. Almost every function has two versions ,one for UNICODE and one for non-UNICODE.

for instance MessageBox is either translated to MessageBoxA (non-UNOCODE version) or MessageBoxW (UNOCDE-version).

Further more :

int WINAPI WinMain ( HINSTANCE hInstance ,HINSTANCE hPrevInstance ,LPSTR lpCmdLine, int nCmdShow ) 
{
// ...
}

is often defined as :

int WINAPI _tWinMain ( HINSTANCE hInstance ,HINSTANCE hPrevInstance ,LPTSTR lpCmdLine ,int nCmdShow ) 
{
// ...
}

for the last version you need to include <tchar.h> which has the right translation for _tWinMain (or _tmain when building consle-app).

Hope this clarefies things for you.


It's most likely a wide char vs ordinary char issue. Try changing the code to:

#include <windows.h>

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

If this solves your problem it means your project is configured for wide characters rather than ordinary chars. Adding an L in front of a string constant will make it a wide char constant. This is generally a good thing since it's way easier to manage internationalization for a wide char application.

These web pages covers the Windows API and unicode in more detail:

http://msdn.microsoft.com/en-us/library/ff381407(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/dd374089(v=vs.85).aspx


#include <windows.h>

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

The issue is most likely that you are building a UNICODE application and are passing pointers to char strings when the API wants pointers to wchar_t strings

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜