使用Visual C ++ 2008 Express编译的DLL在Win2k上运行RunDll32问题

时间:2009-02-18 03:11:54

标签: visual-c++ dll manifest windows-server-2000

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

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

  

“加载mysampledll.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?有没有办法更改清单以使用Win2k中默认可用的旧版Visual C ++运行时?对不起我对这些事情的无知,并提前感谢您的帮助。

4 个答案:

答案 0 :(得分:0)

尝试安装Visual Studio 2008 Redistributable package

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

不要混淆。这不是CLR。 CLR用于托管代码,而不是本机英特尔可执行文件。如果您将它们动态链接到运行时,即使本机可执行文件也需要Microsoft运行时库dll。这是项目属性,C ++,代码生成,运行时库=多线程DLL的默认设置。您可以通过选择多线程来避免这种情况,这将在库代码中静态链接。

答案 1 :(得分:0)

我想说在Windows 2000机器上你的DLL不会加载,因为它缺少一个依赖项。

您可以通过下载此处找到的取决于实用程序找到遗漏的内容:http://www.dependencywalker.com/

如果它是一个mCR的MSCRT DLL,那么你需要用你的DLL重新识别这些DLL。

答案 2 :(得分:0)

问题是您正在尝试运行使用链接的调试C-Runtime(CRT)库编译的DLL。

要解决此问题,请将非调试CRT与您的DLL链接:

选项1:构建和分发发行版。 (这是你在发布时应该做的事情。) 要做到这一点:

  • 列表项
  • Build.Configuration Manager ...并将目标风格从Debug更改为Release;或
  • Build.Batch Build ...并检查Debug和Release;和
  • 使用Release目录中的二进制文件。

选项2:使用非调试CRT构建调试二进制文件。 要做到这一点:

  • 列表项
  • Project.Properties ...
  • 导航至C / C ++,代码生成
  • 对于Runtime Library,选择Multithreaded DLL或Multithreaded。

我倾向于使用选项2进行快速和脏项目,我想要零售CLR的速度,但是想要我的代码的所有调试信息。

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

答案 3 :(得分:0)

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

如果你正在做任何更复杂的事情,比如构建一个其他应用程序将加载的DLL,这是不够的,但这对于大多数情况来说已经足够了。