原因分析:
综合互联网上的资料,绝大部分是以下三种原因:
该问题的原因之一:guiminer程序不完整,请重新下载绿色纯净版。
该问题的原因之二:您的计算机的Windows Installer服务没有开启。
其解决方法是打开控制面板→管理→服务,将Windows Installer服务开启,并设为自动,再重启电脑。
该问题的原因之三:您的计算机上没有安装Visual Studio的运行库。
该应用程序是Visual Studio 2005及其以上版本开发的,其依赖于相应的运行库,而您的电脑上没有安装该运行库。(对于VC6或VS2003开发的应用程序,如果缺少库文件,是会提示缺少“**.dll”,但VS2005或VS2008的却只提示“由于应用程序配置不正确??”。)
其解决方法不是重装应用程序,更不是重装系统,而是安装相应的运行库(Microsoft Visual C++ 20** Redistributable Package,即vcredist_x86.exe。
★区分您的程序是VS的哪个版本开发的确实有点困难,甚至有些软件是多个版本开发的,那就多种vcredist_x86.exe都装上,它们互相兼容,就能解决您计算机上大多数软件的同类问题了。(2005和2008的都装上后“添加/删除程序”会显示如图5)。
★以下以“20**”代表“2005”或“2008”或“2009”或“2010”。
所需安装包
仅需一个文件——微软官网下载中心下载的vcredist_x86.exe
步骤
打开控制面板→管理工具→服务,如果Windows Installer服务没有开启,则设其为自动,再重启电
脑。如果没有解决问题则继续。
可以初步判断您的程序是VS的哪个版本开发的。
(打开应用程序所在目录,搜索是否有mfc或msvc开头的文件,如果有,请查看其文件版本可知VC的版本。请看下图,8表示VC8.0开发的,9表示VC9.0开发的)
VS2003的VC版本是VC.1,
VS2005的VC版本是vc8.0,
VS2008的VC版本是vC9.0。
在控制面板的“添加/删除程序”查看本机是否安装了Microsoft Visual C++ 20** Redistributable Package。
如果没有上图中的Microsoft Visual C++ 20** Redistributable,则继续。
从微软下载中心下载Microsoft Visual C++ 20** Redistributable Package。该文件有32位的(X86),也有64位的(X64)。下载地址如下。
双击运行刚才下载到的vcredist_x86.exe,其会自动安装Microsoft Visual C++ 20** Redistributable Package
检查“添加/删除程序”里是否有了该项
如果有该项,则说明安装成功。然后开启你的应用程序,如果没有报错,则说明问题解决。
首先总结一下“由于应用程序配置不正确,应用程序未能启动”这类问题出现的原因:在Windows XP SP2以后,Windows引入了Side-by-Side执行的概念,这个概念本来是.NET提出来的,但是Windows后来将这个概念集成到操作系统层面上来了。大家都应该知道Dll Hell的问题,为了解决Dll Hell问题,Side-By-Side提出不同版本的dll文件可以同时存在于同一个系统里面,而且依赖于不同版本dll的应用程序在运行的时候可以使用到它当初被编译生成的dll。举个例子:
1、假定编写了一个C++程序A,是使用MFC 8.0(这个版本是随着Visual Studio 2005)发布的。
2、之后机器升级了Visual Studio的版本,从2005升级到2008,2008的MFC库是9.0版本的,这个时候操作系统里面安装了两个版本的MFC,分别是8.0和9.0。
3、用Visual Studio 2008编写了另外一个C++程序B,B依赖与MFC 9.0。
4、如果运行程序A的话,操作系统会将MFC 8.0加载到A的进程里面。
5、如果这时同时运行程序B,操作系统会将MFC 9.0加载到B的进程里面。这就是Side-by-side的执行概念。
操作系统之所以能够这样做,是因为它在加载程序A和B之前,除了查看PE格式里面A和B所依赖的Dll信息,都会查看A和B的manifest文件。Manifest文件保存了Windows可执行文件(包括exe和dll文件)要运行起来的环境设置信息,文件名一般是可执行文件的文件全名加上.manifest。例如notepad.exe的manifest文件就应该是notepad.exe.manifest。另外有的程序将manifest文件直接嵌入到可执行文件的资源里面了,这也就是为什么有的时候看不到程序的manifest文件的原因。通常来说,一个manifest文件的内容大致如下:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.DebugCRT' version='9.0.21022.8'
processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
</assembly>
上面的例子里面,就说明这个程序依赖于CRT 9.0,而且是调试版的,CPU架构是32位的CPU。对于将manifest文件嵌入到资源文件的程序也有办法看到manifest的信息。
1、一种是使用mt.exe(Visual Studio自带的manifest处理程序):
mt -inputresource:test.exe#1 /out:test.manifest
2、另外一种是使用dumpbin程序将整个exe的内容打印到一个文件,然后用文本编辑器打开,搜索Assem字符串样式就能找到manifest信息:
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)