我开始使用以下简单的消息框应用程序。问题是当我运行这个应用程序时,文本是中文。我显然有一个编码问题。有人能指我到某个地方,我可以了解一下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;
}
答案 0 :(得分:3)
当使用Windows API时(几乎)每个带有以空字符结尾的字符串的声明都使用TCHAR
,LPTSTR
和LPCTSTR
定义为char
,{{1}当您不使用UNICODE作为字符集构建时,以及char*
当您使用UNICODE字符集构建时,它们被定义为const char*
,wchar_t
和wchar_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字符串的指针