【原创】
转载请注明出处
问题解决方法仅限于我的情况,就当给大家个提示。
我的电脑环境:Windows 7 64位
编译器环境:VS2005
出现这个问题可能是因为引用了MFC的东西,并且工程设置为 在共享DLL中使用MFC
【解决方法一】:改为在静态库中使用MFC(所有相关exe和dll都要修改为统一的静态编译)
【解决方法二】:
在说解决方法之前呢,我们先来说一下在共享DLL中使用MFC时,怎么来确定需要包含哪些文件。
首先我们先来看一下VS2005编译器的一些配置信息:
我们可以看到,Microsoft Visual Studio 2005下面的版本显示为:8.0.50727.762(SP.050727-7600),并且已安装的产品中有一项是:简体中文Service Pack 1,结合这两项,可以确定,我的VS2005安装了SP1的补丁,并且从已安装产品中看不到任何其他的类似SP1的升级补丁,也就是说我这是一个比较干净的纯VS2005外加一个SP1的补丁。现在步入了问题的关键,我们找到工程中的一个exe(或者dll)的代码Release目录(通常在代码文件夹中),找到下面的文件(****.intermediate.manifest)
打开它,会看到类似下面的信息
我们看到 Microsoft.VC80.CRT 和 Microsoft.VC80.MFC 的 version=8.0.50727.762,它的意思是我所打开的这个exe(或者dll)运行时,必须得需要这个版本的MFC和CRT的相关dll的支持,有的同学可能会好奇,都有哪些DLL呢?我们打开下面的目录(我的使用MFC的工程都是32位的,所以打开了x86目录):
这两个文件夹中的DLL便是在共享DLL中使用MFC时,所需要包含的DLL文件。也就是说,我们要想保证exe和dll在其他电脑上运行正常,必须得把这两个文件夹中的所有DLL文件(当然如果你通过工具查出来你程序有哪些DLL没有引用,那么可以不必包含它)和exe、dll等一系列文件放在同一个目录,或者放在windows的系统目录下,才能保证我们的exe和dll(属性为在共享中使用MFC)能够正确运行或加载。文件如下图所示:
我们打开文件 Microsoft.VC80.CRT.manifest ,如下图所示:
version="8.0.50727.762",是不是很面熟啊? Microsoft.VC80.CRT.manifest中的version 与我们上面提到的 Doyo.exe..intermediate.manifest 中的版本号是一样的。这意味着,我的工程所生成的exe所需要的MFC的dll版本与VS2005提供给我的MFC的dll的版本是完全一样的,那么此时我的exe运行肯定没有任何问题。为了保证在用户电脑上运行也没有问题,那我就必须得把这些DLL全都(如果有的DLL没用到,可以排除掉)放到与我的exe、dll同一级目录下面,发给用户使用。如果每次发布程序时,都要把这么多DLL放进去,实在是太乱了,那么我们可以选择另外一种方法,如下图所示:
-
文件vcredist.msi是VS2005的运行环境的安装文件,我们用下面这个命令把它里面的所有文件提取出来:
msiexec /a "E:\\vcredist.msi" /qb TARGETDIR="E:\\MSIUnzip"
可以看到提取出来后的文件如下图所示
打开目录如下图所示:
查看所有dll文件的版本均为 8.00.50727.762,正好与VS2005的SP1版本一样,并且与我们生成的exe、dll的manifest中指定的版本一样,同时与Microsoft.VC80.CRT.manifest中的version也相同,证明安装文件vcredist.msi的版本正好是我们需要的版本(vcredist.msi会有很多版本,但一定要找到我们所需的正确版本才行)。文件vcredist.msi的执行方法与exe类似,但需要指定必须 msiexec 命令,例如像下图显示这样(msiexec的具体用法可以MSDN上面搜到):
至此,我详细描述了正确的使用流程,
下面我要说一下容易出现错误的地方以及怎么避免
今天有些事情要忙,改天抽空再继续写......
......
接下来再提出一个问题以及解决方法:
应用程序无法正常启动(0xc0150002)。请单击"确定"关闭应用程序。
【未完待续】
QQ:24716177