VC++ UNICODE编程设置

记录一下使用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

参考

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实现。

参考

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目录中。然后 全部重编译。

参考

其他

下面是网上搜集的资料,主要是针对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)   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值