Visual c++ 使用Visual C++;2008快速编译DLL 首先,我不是C++程序员(但我在学习)。我终于成功地使用Visual C++ 2008 Express版修改和编译了一些C++源代码。我尝试着在Visual C++ 2003的完整版本中编译相同的代码,但没有成功(我得到了各种各样的错误,但没有运气)。

Visual c++ 使用Visual C++;2008快速编译DLL 首先,我不是C++程序员(但我在学习)。我终于成功地使用Visual C++ 2008 Express版修改和编译了一些C++源代码。我尝试着在Visual C++ 2003的完整版本中编译相同的代码,但没有成功(我得到了各种各样的错误,但没有运气)。,visual-c++,dll,manifest,windows-server-2000,Visual C++,Dll,Manifest,Windows Server 2000,问题是,在Windows Vista上使用RunDll32调用DLL时一切正常,但在Windows 2000上尝试相同的RunDll32调用时,出现以下错误: “加载mySampleDell.dll时出错” “找不到指定的模块。” 当然,我试过设置完整路径,移动文件等等…但是运气不好。我保证该文件存在并具有正确的权限 我想可能是Vista中与DLL一起编译的清单有问题。因此,我使用资源编辑器删除了它,但在Vista和Win2k中出现了相同的错误。这是舱单: <assembly xmlns=

问题是,在Windows Vista上使用RunDll32调用DLL时一切正常,但在Windows 2000上尝试相同的RunDll32调用时,出现以下错误:

“加载mySampleDell.dll时出错” “找不到指定的模块。”

当然,我试过设置完整路径,移动文件等等…但是运气不好。我保证该文件存在并具有正确的权限

我想可能是Vista中与DLL一起编译的清单有问题。因此,我使用资源编辑器删除了它,但在Vista和Win2k中出现了相同的错误。这是舱单:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
        <requestedPrivileges>
            <requestedExecutionLevel level="requireAdministrator" uiAccess="false"></requestedExecutionLevel>
        </requestedPrivileges>
    </security>
    </trustInfo>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></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>

现在,我假设问题在于Win2k没有安装Microsoft.VC90.CRT,但是为什么我的DLL有这种依赖关系?我在项目属性中将“公共语言运行时支持”设置为“无公共语言运行时支持”,那么为什么它仍然需要CLR呢?有没有办法改变清单以使用默认的Wi2K默认的C++运行时?很抱歉我对这些问题一无所知,并提前感谢您的帮助。

尝试安装

包含程序需要的C++运行时DLL。


别弄糊涂了。这不是CLR。CLR用于托管代码,而不是本机英特尔可执行文件。如果将本机可执行文件动态链接到运行时,则即使是本机可执行文件也需要Microsoft运行时库dll。这是Project属性中的缺省值,C++、代码生成、运行库=多线程DLL。您可以通过选择多线程来避免这种情况,它会在库代码中静态链接。

我想说,在Windows 2000框中,您的DLL不会加载,因为它缺少依赖项

您可以通过下载此处的dependens实用程序来查找缺少的内容:


如果是错误的MSCRT DLL,则需要将这些DLL与DLL一起重新分配。

问题在于,您正试图运行一个使用链接到的调试C运行时(CRT)库编译的DLL

要解决此问题,请在非调试CRT中链接DLL:

选项1:构建和分发发布版本。(这是你应该做的,当它的时间释放。) 为此:

  • 列表项
  • 构建。配置管理器。。。并将您的目标风格从调试更改为发布;或
  • 生成。批生成。。。调试和发布的检查;及
  • 使用发布目录中的二进制文件
选项2:使用非调试CRT构建调试二进制文件。 为此:

  • 列表项
  • 项目。属性
  • 导航到C/C++,代码生成
  • 对于运行库,选择多线程DLL或多线程
我倾向于选择快速和肮脏的项目的选项2,我想要零售CLR的速度,但是想要我的代码的所有调试信息


(顺便说一下,CLR!=CRT,但这是一个不同的讨论。)

请注意,如果您不希望用户运行CRT安装程序,也可以随应用程序重新分发CRT DLL。您可以在redist\x86下的VC安装目录中找到它们(C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT是我机器上的完整路径)。请注意,您必须复制该目录中的所有四个文件(三个DLL和一个清单),并将它们放在EXE旁边才能正常工作


如果您正在做任何更复杂的事情,比如构建一个DLL供其他应用程序加载,这是不够的,但在大多数情况下,这就足够了。

非常感谢您的帮助大家(thinkcube、jussij和Ants)。我不敢相信我把CRT和CLR搞混了,但在盯着代码看了几个小时后,我猜奇怪的事情可能会发生!