Visual C++中“Unicode字符集”报错问题初探

第一类错误:很多时候在我们读一些英文编程资料的时候,经常会遇到写Windows主入口函数的问题,英文一般会这样写:

//This is winmain, the main entry point for Windows applications

int WINAPI WinMain(

HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow)

不过照抄下来在VS2005VS2008编译的时候总有错误:

error C2731: “WinMain”: 无法重载函数.

其实这是因为WinMain函数原始定义中lpCmdLine的类型是char *,但在中文系统环境下因为启用了Unicode支持,LPTSTR代表的是WCHAR *

所以上述函数我们就应该这样来写:

//This is winmain, the main entry point for Windows applications

int WINAPI WinMain(

HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow )

自然就不会有问题了。

第二类错误:

error C2440: “=”: 无法从“const char [11]”转换为“LPCWSTR”

error C2664: “CreateWindowExW”: 不能将参数 2“const char [11]”转换为“LPCWSTR”

代码在VC6中没问题. 因为它的代码没有按可编译为UNICODE版本的方式写,VS2005默认是UNICODE编码的。所以所有使用到字串的地方都会出错。

方法1:修改VS2005的设置:选择你的项目-》属性-》常规-》设置为不使用UNICODE,发现设置为多字节字符集也可以。发现用VS2005打开VC6的源代码,转换后是使用的多字节字符集。

方法2:修改代码。字串前加TEXT宏。如

hwnd=CreateWindow(TEXT( "Weixin2003 "),TEXT( "北京维新科学技术培训中心"),WS_OVERLAPPEDWINDOW, 0,0,600,400,NULL,NULL,hInstance,NULL);

WinMain改为_tWinMain等。

char 统统换成TCHAR;字符串换成 _T("字符串");不论是否是UNICODE编码都应该如此。因为编译的时候,会根据是否定义了UNICODE来选择编译WCHAR还是char

方法3把所有的字符串用宏_T处理,这样: "my first window" 换成 _T("my first window") 。包含头文件 #include <tchar.h>

ps:对初学者,可以不使用UNICODE,但以后还是要学会编写UNICODE编码的程序。

posted @ 2012-10-23 14:49  红雨箫浪  阅读(621)  评论(0编辑  收藏  举报