Chinaunix首页 | 论坛 | 博客
  • 博客访问: 692258
  • 博文数量: 34
  • 博客积分: 4020
  • 博客等级: 上校
  • 技术积分: 367
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-05 16:22
文章分类

全部博文(34)

文章存档

2010年(1)

2009年(16)

2008年(9)

2007年(8)

我的朋友

分类: WINDOWS

2009-08-05 13:45:05

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



阅读(4437) | 评论(0) | 转发(0) |
0

上一篇:网站开发准备工作

下一篇:VSS相关技巧

给主人留下些什么吧!~~