VC++ UNICODE编程设置
2011-05-03 10:37
316 查看
记录一下使用VC++6.0过程中遇到的问题及技巧:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/test1.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
原因:
UNICODE版的可执行程序的进入点是wWinMainCRTStartup,而不是默认的WinMain。
解决办法:
在IDE中设定进入点:
Project——>Settings...——>Link——>Category——>Output,在Entry-point symbol后输入wWinMainCRTStartup
或者直接在头文件中用如下代码指定:
参考:
http://msdn.microsoft.com/en-us/library/dybsewaf(VS.80).aspx
方法:
TCHAR szTstr[128] = _T("I am 中国人/n你呢?");
#ifdef UNICODE
char szOut[128];
wsprintfA(szOut, "%ls", szTstr); //%ls修饰符将szTstr视为PWSTR
MessageBoxA(NULL, &szOut[0], "MessageBoxA", MB_OK);
MessageBoxW( &szTstr[0], L"MessageBoxW", MB_OK);
#else
wchar_t szOut[128];
wsprintfW(szOut, L"%S", szTstr); //%S修饰符将szTstr视为PSTR
MessageBoxA( &szTstr[0], "MessageBoxA", MB_OK);
MessageBoxW(NULL, &szOut[0], L"MessageBoxW", MB_OK);
#endif上面的演示代码中,无论你是否使用UNICODE编码,都将得到一份UNICODE字符串和一份MBCS字符串(其中之一需要用wsprintf转换得到,另一份不需要转换),并显示输出。
如果你担心szOut的空间太小,完全可以仿照ATL转换宏,使用堆栈上动态内存申请函数calloc实现。
参考:
http://msdn.microsoft.com/en-us/library/805c56f8(VS.80).aspx
http://msdn.microsoft.com/en-us/library/87zae4a3(VS.80).aspx
http://msdn.microsoft.com/en-us/library/ms647550(VS.85).aspx
方法:
从VS6的安装盘上VC98/MFC/LIB下的MFCS42UD.LIB、MFCS42UD.PDB、MFCS42U.LIB及MFCS42U.PDB复制到VS安装目录下的VC98/MFC/Lib目录中。然后全部重编译。
参考:
http://blog.ednchina.com/opencv2008/218694/message.aspx
http://msdn.microsoft.com/en-us/library/yd4f8bd1(VS.71).aspx
其他:
下面是网上搜集的资料,主要是针对MFC的众多版本的命名说明:
Debug
MFC42D.DLL (core), MFCO42D.DLL (OLE), MFCD42D.DLL (database), MFCN42D.DLL (network), MFCS42D.LIB (static)
Release
MFC42.DLL (combined), MFCS42.LIB (static)
Unicode Debug
MFC42UD.DLL (core), MFCO42UD.DLL (OLE), MFCD42UD.DLL (database), MFCN42UD.DLL (network), MFCS42UD.LIB (static)
Unicode Release
MFC42U.DLL (combined), MFCS42U.LIB (static)
1. 使用UNICODE编码编译时出错的处理
最近将原来MBCS编码的程序要改为UNICODE编码,结果设置完成后编译报错:msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/test1.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
原因:
UNICODE版的可执行程序的进入点是wWinMainCRTStartup,而不是默认的WinMain。
解决办法:
在IDE中设定进入点:
Project——>Settings...——>Link——>Category——>Output,在Entry-point symbol后输入wWinMainCRTStartup
或者直接在头文件中用如下代码指定:
#ifdef UNICODE
#pragma comment(linker,"/ENTRY:wWinMainCRTStartup")
#endif
参考:
http://msdn.microsoft.com/en-us/library/dybsewaf(VS.80).aspx
2. 多字节和UNICODE之间的转换
除了常见的函数转换(MultiByteToWideChar和WideCharToMultiByte)和宏转换(ATL宏,如A2W、W2A、W2CA等)以外,下面再给出一种使用wsprintf函数的方法:方法:
TCHAR szTstr[128] = _T("I am 中国人/n你呢?");
#ifdef UNICODE
char szOut[128];
wsprintfA(szOut, "%ls", szTstr); //%ls修饰符将szTstr视为PWSTR
MessageBoxA(NULL, &szOut[0], "MessageBoxA", MB_OK);
MessageBoxW( &szTstr[0], L"MessageBoxW", MB_OK);
#else
wchar_t szOut[128];
wsprintfW(szOut, L"%S", szTstr); //%S修饰符将szTstr视为PSTR
MessageBoxA( &szTstr[0], "MessageBoxA", MB_OK);
MessageBoxW(NULL, &szOut[0], L"MessageBoxW", MB_OK);
#endif上面的演示代码中,无论你是否使用UNICODE编码,都将得到一份UNICODE字符串和一份MBCS字符串(其中之一需要用wsprintf转换得到,另一份不需要转换),并显示输出。
如果你担心szOut的空间太小,完全可以仿照ATL转换宏,使用堆栈上动态内存申请函数calloc实现。
参考:
http://msdn.microsoft.com/en-us/library/805c56f8(VS.80).aspx
http://msdn.microsoft.com/en-us/library/87zae4a3(VS.80).aspx
http://msdn.microsoft.com/en-us/library/ms647550(VS.85).aspx
3.调试UNICODE程序时,要求输入mfcs42ud.pdb路径
在Debug模式下调试UNICODE编码的程序时(以前是MBCS编码,没有出现过此问题),提示"Please enter the path for mfcs42ud.pdb",虽然取消后可能继续运行,但是无法在监视窗口查看变量内容。方法:
从VS6的安装盘上VC98/MFC/LIB下的MFCS42UD.LIB、MFCS42UD.PDB、MFCS42U.LIB及MFCS42U.PDB复制到VS安装目录下的VC98/MFC/Lib目录中。然后全部重编译。
参考:
http://blog.ednchina.com/opencv2008/218694/message.aspx
http://msdn.microsoft.com/en-us/library/yd4f8bd1(VS.71).aspx
其他:
下面是网上搜集的资料,主要是针对MFC的众多版本的命名说明:
Debug
MFC42D.DLL (core), MFCO42D.DLL (OLE), MFCD42D.DLL (database), MFCN42D.DLL (network), MFCS42D.LIB (static)
Release
MFC42.DLL (combined), MFCS42.LIB (static)
Unicode Debug
MFC42UD.DLL (core), MFCO42UD.DLL (OLE), MFCD42UD.DLL (database), MFCN42UD.DLL (network), MFCS42UD.LIB (static)
Unicode Release
MFC42U.DLL (combined), MFCS42U.LIB (static)
相关文章推荐
- VC++的Unicode编程
- VC++的Unicode编程[转]
- VC下的Unicode编程
- VC++的Unicode编程(经典之作,交流传薪)
- VC 编程ANSI环境下读写Unicode文件和将CStdioFile类扩展,读取UNICODE文本文件
- VC++编程之字符串解惑--Unicode & MBCS
- VC++的Unicode编程
- VC编程之设置客户区背景图片
- VC 编程ANSI环境下读写Unicode文件和将CStdioFile类扩展,读取UNICODE文本文件
- VC++的Unicode编程(宏UNICODE与_UNICODE)
- VC++的Unicode编程(转)
- Win7下VC编程设置冬眠(需要开放【SE_SHUTDOWN_NAME】权限)
- (非常好的Word操作封装类)VC中进行office编程的-操作word,可以设置文字的样式,新建表格
- 【转载】 VC++ Unicode 编程
- VC++的Unicode编程
- VC编程之设置客户区背景图片
- VC编程实现位图处理类(显示位图、加载位图、获取/设置像素点颜色)
- VC++的Unicode编程
- VC 编程ANSI环境下读写Unicode文件和将CStdioFile类扩展,读取UNICODE文本文件
- VC编程 设置IE浏览器代理(不需重启浏览器)