VC6工程迁移到VC2008 SP1中,使用MFC 9.0静态链接后运行错误的解决办法

来源:互联网 发布:ctr数据是什么 编辑:程序博客网 时间:2024/05/17 08:56

微软前不久发布了Visual Studio 2008 Service Pack 1,其中包含了据说是有BCGSoft提供的一些新类,可以直接使用Office 2007/Visual Studio 2005的界面,闻之大喜,终于不用再眼馋BCGControlBar和Xtreme Toolkit这些付费的库了,为了获得VC6的界面,俺还在用自己4年前写的库:)

花了半天时间把手上的工程由VC6迁移到了VC2008,使用动态链接到MFC,一切正常(可惜在中文环境下字体很难看,这个貌似是一个BCG Library的bug,回头等有空再来解决它)。考虑到客户机上可能没有MFC 9.0的DLL,于是改成了静态链接,可惜编译链接没问题,运行时却出错了。

出错的位置位于AfxTabCtrl.cpp第1395行,一个ENSURE宏断言错误,看上去是找不到一个字符串资源。这种错误最为头疼,仔细检查了compiler和linker的设置,使用的库版本,没有发现错误,只好使用土办法“最小系统法”,用VC6生成一个MDI工程,转换到VC2008,加入一个CDockablePane派生的窗口,使用静态链接……果然同样的错误,接着生成了一个空的VS2005 like的空项目,然后从代码入手,一一对比检查,还是没有找到错误的地方,到底问题出在哪呢?忽然想到,或许应该从最原始的地方入手,既然是找不到IDS_AFXBARRES_CLOSEBAR定义的字符串,那么就找找看它在哪定义的,在atlmfc目录下搜索,这个ID定义在afxribbonres.h而存放于afxribbon.rc中。原来问题就在工程的rc文件中。VC2008生成的工程,在其rc文件中有如下代码:

    #if !defined(_AFXDLL)
    #include "afxribbon.rc"  // MFC ribbon and control bar resources
    #endif
说明在静态链接的时候,应该手动包含此资源。VC6生成的rc文件中自然是没有这一动作的了,于是打开rc文件,加上这一段代码,顺利通过。