把最近踩的坑总结一下(1)——二级MSoffice题库软件自动更新版本V2.0

1.自动更新的下载功能只在开发机上能够正常运行,在其余非win10系统上会出现异常c++

 

        开发机上的下载更新功能正常,可是在两台win7和一台win8.1机器上测试时老是出现上图的现象。弹出的窗口表示触发了自定义的异常处理机制,下载器在初始化时出错了。下载器使用的是迅雷云开放平台提供的动态连接库,由于要在C#中调用动态连接库中函数,直接使用DllImport使用没成功,本身用VC++写了一个动态连接库把迅雷云开放平台的动态连接库包装了一下。这个异常提示看不出什么有用的信息,把异常处理代码去除后又测试了一下(原谅我这种脑残般的操做),此次变成下图这样的提示:windows

        貌似是个内存错误,不过依然不知道什么问题,捉急!那个经典疑问又来了:在我电脑都好好的呀!多线程

       其实这个时候应该意识到是本身写的动态连接库问题,可是当时反应仍是慢了一步。先是在网上百度了一番,未果。而后又以“VS2015编写的Dll怎样在win7上使用”为关键字百度了一番,各类答案,众说纷纭,有的说须要修改项目配置属性,有的说须要安装VC++ 2015 Runtime,各类答案都有。死马当活马医,先安装vc++ 2105 runtime试试,结果失败。而后又对照一个答案修改以下图项目属性里的若干配置:函数

 

         一通配置事后,再试,直接编译不经过,报一堆错,见下图:工具

 

          看到这个错误数量,我也是无语了。还有人说要把动态库dll改为静态库lib,可是查了一下貌似C#没法直接使用静态库lib。测试

          冷静一下,仔细观察了一下。项目配置属性页里的目标平台版本和平台工做集分别是8.1和V140,难道和这个有关系?8.1是指这个生成的dll文件只能工做在win8.1及以上系统中?spa

         试着选择其余平台版本,无奈8.1是最低的。后面的平台工做集也只有两个选项另外一个选项在以前的试验中已经试过不起做用。线程

         看来得试试安装其余平台工做集,可是这个平台工做集没法单独安装。只有安装相应版本的VS,才能得到对应的平台工做集。虽然麻烦,可是值得一试。先装个VS2010试试,安装完成后,平台工做集中多处两个选项,见下图 debug

        多出1个V100和V90。其余配置保持不变,选择V100而后编译,没有error和warning,顺利经过。而后在两台win7和一台win8.1专业版测试机上替换掉对应的dll文件再次启动程序,此次没有异常出现,下载更新功能正常,问题彷佛顺利解决。3d

        还有其余的解决办法吗?

 

       上图是一开始的项目配置,平台工做集是V140,配置为debug,运行库是多线程调试DLL(/MDd)。这个配置状况下,编译没问题,可是在win7和win8.1的测试机上没法正常工做。

        在保持其余项目配置不变的状况下,将平台工做集改成v100后编译生成的dll文件在测试机上能够正常运行。这是我上面所使用解决办法。如今介绍另外一种解决办法,无需安装其余平台工做集,只需更改项目配置便可。

        在保持平台工做集为V140的状况下,将配置改成Release,运行库改成多线程(/MT)。从新编译生成dll文件,这时会发现dll文件相较以前的变大了。将dll放到测试机上运行功能正常,程序正常运行。

       若是没有修改项目编译配置为Release,而只修改了运行库,是会编译出错的。

 

       为何会这样呢?让咱们回到一开始的配置debug、V140、多线程调试(/MDT)。而后利用Dependency Walker查看依赖库,在开发机器上是这样的:

 

 

      在其中一台win7测试机上是这样的:

      能够看到,在win7机器上,除了第一个kernel32.dll依赖库之外,其余3个依赖库都没有!

       而后咱们把平台工做集修改成V100,再次生成dll而后使用工具查看,开发机器结果以下图: 

       依赖库有所改变,4个变为3个。

       Win7测试机的状况以下图:

         能够看到,此次所需的依赖库都有。

        而后,将平台工做集改回V140,编译配置改成Release,代码生成改成多线程(/MT),用工具查看dll所需的依赖库以下,能够看到如今依赖库只剩下一个kernel32.dll,可是相应的,生成的dll文件体积增大到108kB。这中间发生了什么,还不清楚。

       win7测试机上使用工具查看依赖库的结果以下图:

 

       由上面的分析可知,以debug模式编译,修改平台工做集可解决问题,可是目标机器须要有另外两个依赖库;以release模式编译并修改生成代码运行库也可解决问题,而且目标机器只需有kernel32.dll便可,这是windows系统自带的。因此建议使用第二种解决方案。

相关文章
相关标签/搜索