动态链接MFC引发的血案

首先简单描述下程序运行的步骤,

我们要去加载两个DLL,先加载的称为A,后加载的称为B,加载A在里面做的事情是动态创建一个全局对象,加载B在里面做的事情是取得这个全局对象,然后干其他事情。

 

我们机子上运行的非常完美。但在用户的机子上却没法运行。报错直接说这个全局对象为空,并没被初始化。真是奇了怪了。

开始认为我们的加载顺序有问题,查了下代码,没问题!

 

我们把程序放在WIN7下测试,也没问题。后来另一位同事在另个新系统下面测试,BUG重现!然后同事想把Visual Studio装上调试,居然又运行完好。头儿提醒可能是加载A没成功。于是卸载VS,先在A中打上日志,又在加载A之前打上日志,一看,发现果然是这个问题!!

 

但为啥会加载失败呢?用depends查看A有两个依赖的dll未知!另外还有个帮忙的同事提醒说,加载失败,可能是由于清单文件所依赖的组件在新安的系统并没有。一看清单*.mainifest文件,果然如此,多了两个外来的动态依赖库,

 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC80.DebugMFC" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>

但转念一想,不对啊,B都没这两个外来组件引入的清单,A怎么多了这两个东西!

将A和B对比编译配置,完全相同,百思不得其解!

 

帮忙的同事又说,A所依赖的我们项目中的dll会不会有动态库?一查,果然如此,另一个的编译选项居然是Use MFC in a share dll!照理说应该编译过不了,但可爱的同事用忽略库的办法将其编译错误去掉,于是导致A生成的清单文件上会出现上述内容。

 

 

应该说,粗心是不可避免的。

但有几点需要以后注意的:

1. 捕获异常措施不够,是其本质原因。

2. 测试环境需要真正模拟玩家环境。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值