您的位置:首页 > 编程语言 > C语言/C++

VC++ UNICODE编程设置

2011-05-03 10:37 316 查看
记录一下使用VC++6.0过程中遇到的问题及技巧:

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: