WinMain与wWinMain,win32的字符集问题

Posted ostin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WinMain与wWinMain,win32的字符集问题相关的知识,希望对你有一定的参考价值。

刚接触win32开发的会发现,用vs新建一个win32项目默认代码里面的入口函数并不是WinMain而是_tWinMain或者wWinMain,这些都有什么区别呢?

WinMain对应的是多字节字符集(ANSI),wWinMain对应Unicode字符集。_tWinMain是tchar.h文件里面定义的:

#ifdef _UNICODE
#define _tWinMain wWinMain
#else
#define _tWinMain WinMain
#endif

 

编译时当字符集为ANSI时就同于WinMain,字符集为Unicode时同于wWinMain。

要更改字符集的话,在vs里面点 项目->项目属性

技术分享图片

 

windows api很多函数都分为两个版本,比如CreateWindow的定义如下:

#ifdef UNICODE
#define CreateWindow  CreateWindowW
#else
#define CreateWindow  CreateWindowA
#endif

 

那么,什么时候该用Unicode字符集,什么时候该用多字节字符集呢?

其实并不是程序中有中文时就必须用Unicode字符集,当windows系统语言为中文时,不管你选择哪个字符集都是可以正常显示中文的,但是系统语言不为中文时就会出现乱码了。所以如果你的软件需要适应多语言的windows系统的话就得用Unicode字符集。

另外需要说明的是,当字符集为Unicode时,向api函数传递的一个字符串的时候应该将该字符串转换为Unicode编码的,可用L转换:

CreateWindow(wndClass, L"这是窗口标题", ......);

以上是关于WinMain与wWinMain,win32的字符集问题的主要内容,如果未能解决你的问题,请参考以下文章

win32API 入口WinMain()内部机理

Win32 API编程:WinMain无法重载函数或_tWinMain无法重载

逆向程序分析:Win32程序入口函数

qtmaind.lib(qtmain_win.obj) : error LNK2019: 无法解析的外部符号 __imp_CommandLineToArgvW,该符号在函数 WinMain 中被引用

LNK2001 unresolved external symbol _winmain@16

c++主函数如何调用"WinMain"函数