VS2005c++;项目 我在VS 2005中为本地Win32/非托管C++创建了一个DLL项目,称之为MyProj.DLL。它依赖于第三方商业DLL,而第三方商业DLL又依赖于msvcr90.DLL(我假设它是从VS2008项目中构建的)。我叫它thirdParty.dll

VS2005c++;项目 我在VS 2005中为本地Win32/非托管C++创建了一个DLL项目,称之为MyProj.DLL。它依赖于第三方商业DLL,而第三方商业DLL又依赖于msvcr90.DLL(我假设它是从VS2008项目中构建的)。我叫它thirdParty.dll,c++,dll,visual-studio-2005,C++,Dll,Visual Studio 2005,我的DLL项目在VS2005中构建得很好。我构建了一个链接到myProj.lib的测试应用程序(同样是VS2005Win32 C++)。(顺便说一句,从.lib的小尺寸以及在运行时应用程序必须找到myProj.dll这一事实来看,.lib只是加载实际dll的loadLibrary()调用的包装器;是否接近?) 我的问题是,在运行时,测试应用程序找不到msvcr90.dll(也找不到msvcp90.dll),它依赖于thirdParty.dll 我安装了微软的ReDIST包,所以所有的STD(9)

我的DLL项目在VS2005中构建得很好。我构建了一个链接到myProj.lib的测试应用程序(同样是VS2005Win32 C++)。(顺便说一句,从.lib的小尺寸以及在运行时应用程序必须找到myProj.dll这一事实来看,.lib只是加载实际dll的loadLibrary()调用的包装器;是否接近?)

我的问题是,在运行时,测试应用程序找不到msvcr90.dll(也找不到msvcp90.dll),它依赖于thirdParty.dll

我安装了微软的ReDIST包,所以所有的STD(9)C++库都在C:\Windows \WINSXS\x86MySoop.VC90.CRTT.…更重要的是,如果我将依赖项遍历器指向thirdParty.dll,它会很高兴地解析对该位置的引用

但是,如果我在测试应用程序(.exe)或myProj.dll中指向dependens.exe,则找不到msvcr90.dll和msvcp90.dll

<>我猜我需要在VS2005中配置一些东西,以便.exe或MyPrim.DLL知道STD C++库的9个版本的位置(大概是ReDIST包安装在C:\Windows \WINSXS)中,但我似乎无法弄清楚它是什么。我走对了吗

我注意到,如果我只是将MSVC*90.DLL文件复制到我的应用程序目录,那么依赖关系就被解决了,但是我会得到关于STD C++ DLL的不正确加载等的运行时错误。


非常感谢。

我会向第三方dll人员询问此事

您是否安装了msvc 2008 redist的

如果Dependes.exe找不到msvcr90.dll,则不会出现问题;如果使用microsoft安装程序,则会自动将其安装在正确的位置;如果应用程序正在运行,则会找到该安装程序。如果不创建清单,则将dll复制到应用程序目录中是没有帮助的

但是你能说出你收到的确切错误信息吗

您还可以查看和查看有关清单的信息。

对我来说,这看起来像是一个“并排装配”问题

据我所知,微软为了阻止过去几年的DLL地狱问题,引入了“并排程序集”的概念

简而言之,这意味着您的应用程序需要告诉Windows它设计用于哪个版本的CRT。安装应用程序时,Windows将确保应用程序获得这些DLL文件的私有副本

要使所有这些工作正常,您需要将应用程序的DLL依赖项嵌入到应用程序清单文件中,并使用应用程序项目设置的清单工具输入和输出部分将其附加到项目中

以下是我用于IDE的清单:



由于缺少MSVCRT运行时DLL文件,不再在Windows XP上运行,但在10多年的时间里一直运行良好,从未附带过MSVCRT运行时DLL文件。

几天前,我遇到了同样的问题。myProj.dll依赖于使用msvcr90的第三方.dll。如果我直接使用myProj.dll构建test.exe,就可以了。但是如果我在test.exe中使用loadLibrary(myProj.dll),调用就会失败。如果我在Java程序中尝试loadLibrary(myProj.dll),也会发生同样的情况

经过对互联网的一些调查和研究,以下步骤解决了我的问题

  • 确保路径上没有msvcr90。 您可以使用process explorer(SystemInternals的procep.exe)查找环境中当前加载的所有msvcr90。事实上,从VC 2005开始,C运行时库只应安装在全局程序集缓存(\winsxs…)中,甚至不应安装在windows或windows\system32下

  • 将dll清单嵌入myProj.dll中。 cl.exe和link.exe生成myProj.dll后,也会生成相应的清单。 然后使用mt.exe-inputresource myProj.dll.manifest-out myProj.dll;二,

  • 以上解决了我的问题,希望能对您有所帮助。
    顺便说一句,我在Windows2008R下使用VC2008,我确实安装了MSVC2008Redist的SP1版本。确切的错误消息是“由于找不到msvcr90.dll,应用程序无法启动。重新安装应用程序…”当我构建使用myProj.dll的应用程序时会发生这种情况。可能此线程:可以为您提供一些信息来解决此问题。我尝试将清单的内容从VS 2008 redist目录复制到项目目录中的一个文件中,然后指出它是项目清单属性中的“附加清单文件”,它构建得很好,但没有解决问题。user42279“尝试复制内容”。您还必须确保清单中包含的详细信息也是正确的。清单的细节决定了程序是如何加载和运行的,所以如果这些不正确,它就不会运行。也许这是最好的方法。然而,可能有腐败的东西。如果是这种情况,请尝试干净的windows安装(vmware)。这样你就可以写下你所做的一切,向他们解释重现这个问题的步骤。谢谢,威梅尔。是的,这就是我今天要做的。而且,我还与第三方人员保持联系。顺便说一下,我忽略了一件事,那就是实际上还有第三个组件——来自另一个第三方的静态链接库(.lib)。它包括clib(愚蠢的字符限制!)…因此我不得不使用/MT(d)构建myProj.dll(同样,使用VS2005)。
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <assemblyIdentity
          name="Xidicone.Windows.Zeus for Windows"
          version="3.9.6.69"
          processorArchitecture="X86"
          type="win32" />
    
      <description>Zeus for Windows</description>
    
      <dependency>
        <dependentAssembly>
          <assemblyIdentity
                type="win32"
                name="Microsoft.VC80.CRT"
                version="8.0.50608.0"
                processorArchitecture="x86"
                publicKeyToken="1fc8b3b9a1e18e3b" />
        </dependentAssembly>
      </dependency>
    
      <dependency>
        <dependentAssembly>
          <assemblyIdentity
              type="win32"
              name="Microsoft.Windows.Common-Controls"
              version="6.0.0.0"
              processorArchitecture="X86"
              publicKeyToken="6595b64144ccf1df"
              language="*" />
        </dependentAssembly>
      </dependency>
    </assembly>