none
安装KB2538242后,在目录名包含%的目录下双击运行MFC程序直接crash

    常规讨论

  • 我们的一个VS2005编译的,动态链接MFC的应用程序,一年前已经发布,之前运行正常,近期发现在特定目录下直接双击就会crash,问题描述和我自己的一些尝试如下,请大家帮忙分析下这个问题,并提出解决方案,谢谢大家

    问题描述,重现步骤:
    1、操作系统安装补丁KB2538242
    2、程序所在的目录名包含有“%”
    3、双击直接运行程序,crash
    4、如果没有安装补丁KB2538242,相同的exe,相同的操作不会出现crash
    5、安装补丁后如果所在的目录名不包含%,那么同样的exe,双击还是可以正常运行

    问题猜测:
    1、我们的程序依赖于Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package,安装KB2538242这个补丁前后,CRT和MFC运行时的版本号从8.0.50727.4053升级到了8.0.50727.6196,运行的变化导致了这个问题的发生


    尝试过的解决方法
    0、升级VS2005,安装对应的补丁:Microsoft Visual Studio 2005 Service Pack 1(KB2538218)之后重编,问题依旧

    1、修改了程序的manifest,用这种方法修改无效,还是会直接crash:
    <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.4053" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> </dependentAssembly> </dependency> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC80.MFC" version="8.0.50727.4053" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> </dependentAssembly> </dependency>

    2、还是修改程序的manifest,用这种方法会提示运行时出错的MessageBox而无法运行(把4053版本的dll和manifest复制到程序旁边也不行,depends里面显示的MFC80U.DLL和MSVCR80.DLL版本是4053)
    <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/> <bindingRedirect oldVersion="8.0.50727.6190-8.0.50727.6196" newVersion="8.0.50727.4053"/> </dependentAssembly> </dependency> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC80.MFC" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/> <bindingRedirect oldVersion="8.0.50727.6190-8.0.50727.6196" newVersion="8.0.50727.4053"/> </dependentAssembly> </dependency>

    3、想尝试把程序的MFC改成静态链接,无奈多年没人维护的老代码,部分代码使用了_AFXDLL的一些特性,改起来也比较麻烦,这个方法尝试了一下后暂时放弃


    两个补丁的下载地址,KB文章可在链接内找到
    Microsoft Visual Studio 2005 Service Pack 1 MFC Security Update
    http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=26401

    Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package
    http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=26347
    • 已更改类型 linyehui 2011年9月26日 10:25 格式错误
    • 已编辑 linyehui 2011年9月26日 10:30 格式调整
    2011年9月26日 10:20

全部回复

  • 又试了下win8,发现Win8下安装了补丁后双击不会crash,看了下,有一个区别:
    MSVCR80.DLL的版本号比补丁中的还要高,版本号是:8.0.50727.6624
    2011年9月27日 6:59
  • 这个是KB2538242的bug,AfxLoadLangResourceDLL错误地使用了路径作为格式化用的字符串。你可以暂时在编译的时候用#define _BIND_TO_CURRENT_MFC_VERSION 0指定目标MFC版本。

    默认加载顺序是首先从WinSxS加载,你需要加一个config文件更改加载顺序。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2011年10月1日 16:32
    版主
  • 非常感谢Sheng Jiang的回复

    我最后的解决方法是把MFC改成静态链接,然后去掉了代码中使用到的DECLARE_DYNCREATE特性。

    你说的方法我也尝试过,但是好像没有起作用。
    另外你说的加一个config文件是怎么个加法?我尝试了在manifest中绑定CRT和MFC的版本,结果还是不行。
    2011年10月12日 7:18
  • Per-application Configuration

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2011年10月12日 19:50
    版主