【原创】

转载请注明出处


问题解决方法仅限于我的情况,就当给大家个提示。

我的电脑环境: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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐