开发VC2008机器上执行没有问题,发布到另外一台机器后无法运行,
提示运势初始化错误:应用程序正常初始化(0xc0150002)失败vcredist_x86已经安装(vcredist_x86 sp1和feature pack支持的两个文件)第一次遇到这个问题,一个下午没搞定。有解决类似问题的朋友指点下。谢谢。

解决方案 »

  1.   

    Microsoft Visual C++ 2005 Redistributable Package 
    Microsoft Visual C++ 2005 SP1 Redistributable Package 
    Microsoft Visual C++ 2008 Redistributable Package 
    Microsoft Visual C++ 2008 SP1 Redistributable Package 
    Microsoft Visual C++ 2010 Redistributable Package 这些有吗?
      

  2.   

    2008、2010的都安装了。2005的没有安装。我使用的是VC2008开发,MFC/C++。今年程序添加了新的工程,这么已发布就出问题了。
      

  3.   

    不依赖。就是单纯的C++/MFC文档视图框架MDI程序。
      

  4.   

    我跟踪了下,InitInstance()这个函数都运行不到就报错误了。是不是说明根本没有运行到我编写的代码部分???
      

  5.   

    你重新编译,静态链接MFC和其他的lib,试一试。
      

  6.   

    这个应该是manifest的问题,在网上搜索2005 程序发布,有那么几步就搞定
      

  7.   

    将你的VC安装目录下的redist目录下的相应文件拷贝过去
      

  8.   

    用Debug方式发布,这样可能大一些,但肯定可以直接运行的。
      

  9.   

    http://blog.csdn.net/swandream/archive/2011/05/23/6438860.aspx
      

  10.   

    帮忙看看我的manifest文件,怎么引用两个版本的CRT文件?一个是name="Microsoft.VC90.CRT" version="9.0.30729.1",最后怎么还有一个name="Microsoft.VC90.CRT" version="9.0.21022.8"目前这个问题还是没有解决,但是可以确定的是DLL依赖问题导致的问题。请各位帮忙看看。<?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"></requestedExecutionLevel>
          </requestedPrivileges>
        </security>
      </trustInfo>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
    </assembly>
      

  11.   

    拷贝到你的运行目录,也就是和你的EXE一个目录,或者也可以拷贝到system32目录下
      

  12.   

    是不是连目录一起拷贝?比如目录结构:
    ------MYAPP
    ------MYDLL
           |--Microsoft.VC90.CRT
                             |--------Microsoft.VC90.CRT.manifest
                             |--------msvcm90.dll
                             |--------msvcp90.dll
                             |--------msvcp90.dll
    还是说所有的文件放进同一个目录下?
      

  13.   

    刚去掉了宏定义
    // -- 添加以下宏定义为了产生正确的manifest文件
    //#define _BIND_TO_CURRENT_VCLIBS_VERSION 1
    得到如下的manifest文件,而实际上我的vc的redist文件下的manifest指示版本为name="Microsoft.VC90.CRT" version="9.0.30729.1"我的应用程序编译出来提示为如下内容:<?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"></requestedExecutionLevel>
          </requestedPrivileges>
        </security>
      </trustInfo>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
    </assembly>
      

  14.   

    我还发现一个问题,从MS下载的VC_REDIST.EXE安装后的DLL版本是9.0.30729.17而不是9.0.30729.1,也就说最后的小版本号升级到17了。但是我的VC2008 sp1安装的却是9.0.30729.1。所以用户即使安装了vc_redist.exe也还是版本不一致的问题存在。这可怎么办???我开发的两台机器都是可以运行的。奇怪了。
      

  15.   

    但是目标机器已经安装过了vc_redist.exe是不是会优先搜索c:\windows\winsxs\目录呢?
    我试试看。要不要修改CRT和MFC下面的manifeest文件版本指示?
      

  16.   

    不要修改,原样拷贝
    优先搜索路径是 本地目录-》windows目录-》system32目录 好像是这样的
      

  17.   

    vs2008是麻烦些。。我一般写程序还是vs2003. 只依赖几个runtime库
      

  18.   

    查看exe依赖的dll, dumpbin. 比如msvcrt90.dll  msvcp90.dll 还有mfc动态库. 以及第三方dll
      

  19.   

    好的,我试试看,要不要修改我的exe文件的manifest文件?
    说明下我的编译:单独生成的manifest文件。
      

  20.   

    用VC6自带的depends工具看看依赖哪些dll
      

  21.   

    我用depency walker可能依赖关系,结果提示我的应用程序找不到msvcr90.dll msvcp90.dll mfc90u.dll的路径信息。提示搜索路径、当前目录找不到。显示一个问号。可是我的程序在我的机器可以执行的啊。
      

  22.   

    具体来看我的应用程序应该依赖MS的三个库文件:
    MSVCR90.DLL
    MSVCP90.DLL
    MFC90U.DLL我通过VC6的工具DEPENDS.exe来看,也看不到这几个库文件的版本信息,提示找不到这几个文件。明明程序在开发机器上是可以运行的,depency walker就是提示找不到它。不知道现在是不是可以断定我的程序就是因为DLL依赖问题导致的运行不了?前面发布的程序就没有遇到类似的问题,可以正常发布部署和运行。
      

  23.   

    我还发现一个问题,为什么我这个工程编译出来的manifest文件在最后多出来一个depency定义?请看如下:<?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"></requestedExecutionLevel>
          </requestedPrivileges>
        </security>
      </trustInfo>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.4148" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" version="9.0.30729.4148" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
    </assembly>
    我看我别的程序都是三个部分,就是这里的前三个部分。可是我这个却发现最后多出一个对name="Microsoft.VC90.CRT" version="9.0.21022.8"版本的依赖定义。这是怎么回事?我检查我的工程依赖的所有DLL,应该都是重新编译,链接到最新的MFC DLL库文件的。有知道这个问题是不是导致不能运行的元凶?说明什么?
      

  24.   

    你可以自己手动创建manifest,然后工程属性里面import manifest指定路径,这样就可以
      

  25.   

    是不是比照自动生成的,自己写一个导入,然后禁止VC自动生成?如下:<?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"></requestedExecutionLevel>
          </requestedPrivileges>
        </security>
      </trustInfo>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.4148" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" version="9.0.30729.4148" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
    </assembly>
      

  26.   

    我试试这么做:
    1、linker->manifest file->generate manifest=no
    2、manifest tool->input and output->addtional manifest files=myapp.manifest请问是这样么?
      

  27.   

    还是不行,我查看EXE文件内嵌的manifest信息,还是依赖两个不同版本的CRT文件。这是怎么回事???简直让我崩溃。
      

  28.   

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"
        xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    <assemblyIdentity
        name="Smartcard.Demo.Application"
        processorArchitecture="x86"
        version="1.0.0.0"
        type="win32"/>
    <description>SCardDemo</description>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="x86"
                publicKeyToken="6595b64144ccf1df"
                language="*"
            />
        </dependentAssembly>
    </dependency>
    <!--
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
    -->
    <asmv3:application>
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
            <dpiAware>true</dpiAware>
        </asmv3:windowsSettings>
    </asmv3:application>
    </assembly>
    厄的manifest
      

  29.   

    我试验了好多种方法,目前还是不行。我照这个地址的方法也是试验了
    http://blogs.msdn.com/b/dsvc/archive/2009/02/18/troubleshooting-manifest-related-issues.aspx
    结果发现时MSVCRT.DLL引用的就的版本库。可是奇怪的是,我同一个机器另外一个工程编译出来的manifest文件就没冲突或者依赖多个不同版本的库文件问题。继续求教。郁闷要崩溃了我
      

  30.   

    有可能是动态加载的组件在目标机器缺失,例如MSXML6.0等,用于分析XML的COM
      

  31.   

    项目设置里:MFC和ATL这两项选择静态链接
      

  32.   

    把此宏加到预处理宏中,这样就所有CRT和MFC都是使用当前最新的版本
    _BIND_TO_CURRENT_VCLIBS_VERSION 参考下面文章:http://connect.microsoft.com/VisualStudio/feedback/details/361682/vc9-sp1-generates-manifests-with-the-wrong-version-numberhttp://blogs.msdn.com/b/vcblog/archive/2008/05/15/vc-runtime-binding.aspx