总原因:
1. 我的exe程序编译时,内嵌了清单文件,而vc2008 sp1在清单文件生成上有bug,默认的清单依赖是 9.0.21022.8,实际需要至少是 9.0.30729.1
2. 我以前的修改是替换了mfc90.dll等dll为sp1的dll,这样子的修改实际上是延续了这个vs2008的bug,
这样根据目标操作系统安装的vc2008运行库,
如果安装的是低于sp1版本(低于9.0.30729.1但大于等于9.0.21022.8)运行库,则系统在加载dll时,错误的根据exe内嵌的清单判断dll版本满足,从而使用了
错误版本的dll,报出无法定位xxx于mfcxxx.dll
如果没有安装任何vc2008运行库,系统无法根据内嵌清单找到要求的dll,则会加载当前目录下dll,运行正常
如果有安装大于等于9.0.30729.1的vc2008运行库,则满足正确清单的要求,运行正常
推测运维两台机器不同情况实际原因:
正常运行的机器上没有安装任何vc2008运行库,不正常运行的机器上面安装了非sp1的vc2008运行库,可以检查
c:\windows\winsxs\x86_microsoft.vc90.mfc_1fc8b3b9a1e18e3b_9.0.30729.4148_x-ww_a57c1f53\ 类似的目录
解决方法:
1. 修改exe生成,将嵌入清单取消,修改单独的manifest文件到正确的版本,并一起发布(没测试)
2. 或者都统一安装vc2008 sp1的运行库(以前安装了低版本的也没问题,因为高版本的安装程序会修改Policy,把低版本的引用指向高版本, http://blog.youkuaiyun.com/fanchuan0077/article/details/5627218)
3. 或者所有的机器都统一不安装任何低于vc2008 sp1的运行库
1. 我的exe程序编译时,内嵌了清单文件,而vc2008 sp1在清单文件生成上有bug,默认的清单依赖是 9.0.21022.8,实际需要至少是 9.0.30729.1
2. 我以前的修改是替换了mfc90.dll等dll为sp1的dll,这样子的修改实际上是延续了这个vs2008的bug,
这样根据目标操作系统安装的vc2008运行库,
如果安装的是低于sp1版本(低于9.0.30729.1但大于等于9.0.21022.8)运行库,则系统在加载dll时,错误的根据exe内嵌的清单判断dll版本满足,从而使用了
错误版本的dll,报出无法定位xxx于mfcxxx.dll
如果没有安装任何vc2008运行库,系统无法根据内嵌清单找到要求的dll,则会加载当前目录下dll,运行正常
如果有安装大于等于9.0.30729.1的vc2008运行库,则满足正确清单的要求,运行正常
推测运维两台机器不同情况实际原因:
正常运行的机器上没有安装任何vc2008运行库,不正常运行的机器上面安装了非sp1的vc2008运行库,可以检查
c:\windows\winsxs\x86_microsoft.vc90.mfc_1fc8b3b9a1e18e3b_9.0.30729.4148_x-ww_a57c1f53\ 类似的目录
解决方法:
1. 修改exe生成,将嵌入清单取消,修改单独的manifest文件到正确的版本,并一起发布(没测试)
2. 或者都统一安装vc2008 sp1的运行库(以前安装了低版本的也没问题,因为高版本的安装程序会修改Policy,把低版本的引用指向高版本, http://blog.youkuaiyun.com/fanchuan0077/article/details/5627218)
3. 或者所有的机器都统一不安装任何低于vc2008 sp1的运行库