记录一下使用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。
解决办法:
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的众多版本的命名说明:
MFC42D.DLL (core), MFCO42D.DLL (OLE), MFCD42D.DLL (database), MFCN42D.DLL (network), MFCS42D.LIB (static)
MFC42.DLL (combined), MFCS42.LIB (static)
MFC42UD.DLL (core), MFCO42UD.DLL (OLE), MFCD42UD.DLL (database), MFCN42UD.DLL (network), MFCS42UD.LIB (static)
MFC42U.DLL (combined), MFCS42U.LIB (static)
阅读(4437) | 评论(0) | 转发(0) |