【问题标题】:RunDll32 Problem on Win2k with Visual C++ 2008 Express Compiled DLL使用 Visual C++ 2008 Express 编译的 DLL 在 Win2k 上的 RunDll32 问题
【发布时间】:2009-02-18 03:11:53
【问题描述】:

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

问题是在 Windows Vista 上使用 RunDll32 调用 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 有这种依赖关系?我在项目属性中将“Common Language Runtime Support”设置为“No Common Language Runtime Support”,为什么还需要CLR?有没有办法更改清单以使用 Win2k 中默认可用的较旧的 Visual C++ 运行时?对不起,我对这些问题的无知,并提前感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    尝试安装Visual Studio 2008 Redistributable package

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

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

    【讨论】:

    • 非常感谢大家(thinkcube、jussij 和 Ants)的所有帮助。我不敢相信我把 CRT 和 CLR 搞混了,但是在盯着代码看了几个小时之后,我猜可能会发生奇怪的事情!
    【解决方案2】:

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

    您可以通过下载此处的 Depends 实用程序来查找缺少的内容:http://www.dependencywalker.com/

    如果丢失的是 MSCRT DLL,那么您需要使用您的 DLL 重新分发这些 DLL。

    【讨论】:

      【解决方案3】:

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

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

      选项 1:构建和分发发布版本。 (这就是你在发布时应该做的事情。) 为此:

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

      选项 2:使用非调试 CRT 构建调试二进制文件。 为此:

      • 列表项
      • Project.Properties...
      • 导航到 C/C++,代码生成
      • 对于运行时库,选择多线程 DLL 或多线程。

      对于快速而肮脏的项目,我倾向于选择选项 2,我想要零售 CLR 的速度,但想要我的代码的所有调试信息。

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-15
          • 2010-10-28
          • 1970-01-01
          • 1970-01-01
          • 2010-10-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多