围绕windows.h缠绕我的头 - const char * vs LPSTR

时间:2011-02-02 02:56:51

标签: c++ c winapi

我开始使用以下简单的消息框应用程序。问题是当我运行这个应用程序时,文本是中文。我显然有一个编码问题。有人能指我到某个地方,我可以了解一下windows.h特定的字符串typedef?

// 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;
}

3 个答案:

答案 0 :(得分:3)

当使用Windows API时(几乎)每个带有以空字符结尾的字符串的声明都使用TCHARLPTSTRLPCTSTR定义为char,{{1}当您使用UNICODE作为字符集构建时,以及char* 当您使用UNICODE字符集构建时,它们被定义为const char*wchar_twchar_t*

同样,const wchar_t*和/或UNICODE定义控制在调用windows-API函数时正在编译哪个函数。几乎每个函数都有两个版本,一个用于UNICODE,另一个用于非UNICODE。

例如,MessageBox被转换为MessageBoxA(非UNOCODE版本)或MessageBoxW(UNOCDE版本)。

更多:

_UNICODE

通常定义为:

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

对于上一个版本,您需要包含int WINAPI _tWinMain ( HINSTANCE hInstance ,HINSTANCE hPrevInstance ,LPTSTR lpCmdLine ,int nCmdShow ) { // ... } ,其中_ <tchar.h>(或_ tWinMain在构建consle-app时具有正确的翻译。)

希望这对你来说是件好事。

答案 1 :(得分:0)

这很可能是广泛的char与普通的char问题。尝试将代码更改为:

#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;
}

如果这解决了您的问题,则意味着您的项目配置为宽字符而不是普通字符。在字符串常量前添加L将使其成为宽字符常量。这通常是一件好事,因为它更容易管理广泛的char应用程序的国际化。

这些网页更详细地介绍了Windows API和unicode:

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

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

答案 2 :(得分:0)

#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;
}

问题很可能是你正在构建一个UNICODE应用程序,并在API需要指向wchar_t字符串的指针时传递指向char字符串的指针