【问题标题】:Delay Loading DLLs延迟加载 DLL
【发布时间】:2010-11-26 04:19:47
【问题描述】:

我急需帮助,我需要在 Visual Studio 中管理应用程序依赖项。应用程序仅在特定版本的 Windows(比如 Windows 7)上链接到 DLL。在其他环境中,不应加载 DLL。我将如何使用 DLL 延迟加载来实现这一点,因为这个主题对我来说是全新的,并且没有任何关于这个特定问题的好的在线参考。

问候

【问题讨论】:

  • 您是在问延迟加载是如何工作的,或者如何应用它?

标签: c++ windows visual-studio dll delayed-execution


【解决方案1】:

您的项目可以通过在 Linker/Input/Delay Loaded DLLs 字段中指定它所依赖的 dll,但在需要时加载它。对于不同的构建配置,此设置可能会有所不同。

【讨论】:

  • 谢谢回复人,但如果适用的话,你能举个例子或代码 sn-p :)
  • 这就是延迟加载的问题:这是一个配置问题,而不是代码问题。
  • 措辞似乎错误:当您说“您所依赖的 DLL 应该与延迟加载容量相关联”时,您似乎指的是从它的组成部分.obj。 /DELAY 标志实际上应用于执行 importing 的模块,而不是 imported 模块。这也是您可以延迟加载 Windows 2000 DLL 的原因,如果没有此支持,这些 DLL 会生成。
  • @MSalters:你是对的:第一个选项是让 dll 支持卸载。已更正,谢谢。
【解决方案2】:

MSDN 有很好的描述here

基本上,您正在做的是将有问题的 DLL 设置为延迟加载部分。然后,在您调用该 DLL 中的函数之前,它不会加载该 DLL。

从上面的链接:

Visual C++ 链接器现在支持延迟加载 DLL。这 使您无需使用 Windows SDK 函数 LoadLibrary 和 GetProcAddress 实现 DLL 延迟加载。

在 Visual C++ 6.0 之前,在运行时加载 DLL 的唯一方法是通过 使用 LoadLibrary 和 GetProcAddress;操作系统将加载 加载可执行文件或使用它的 DLL 时的 DLL。

从 Visual C++ 6.0 开始,当与 DLL 进行静态链接时, 链接器提供延迟加载 DLL 直到程序调用的选项 该 DLL 中的函数。

应用程序可以使用 /DELAYLOAD (Delay Load Import) 链接器选项和辅助函数延迟加载 DLL(默认实现 由 Visual C++ 提供)。辅助函数将在运行时加载 DLL 时间为您调用 LoadLibrary 和 GetProcAddress。

如果出现以下情况,您应该考虑延迟加载 DLL:

您的程序可能不会调用 DLL 中的函数。

DLL 中的函数可能要到程序运行的后期才会被调用 执行。

DLL 的延迟加载可以在构建过程中指定 .EXE 或 .DLL 项目。延迟加载的 .DLL 项目 一个或多个 DLL 本身不应调用延迟加载的入口点 在 Dllmain 中。

【讨论】:

    【解决方案3】:

    您是否考虑过将dynamic loadingLoadLibraryGetProcAddress 一起使用,而不是使用延迟加载?这可能更易于使用。

    typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
    
    // Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.
    
    PGNSI pGNSI;
    SYSTEM_INFO si;
    
    ZeroMemory(&si, sizeof(SYSTEM_INFO));
    
    pGNSI = (PGNSI) GetProcAddress(
       GetModuleHandle(TEXT("kernel32.dll")), 
       "GetNativeSystemInfo");
    if(NULL != pGNSI)
       pGNSI(&si);
    else GetSystemInfo(&si);
    

    【讨论】:

    • 如何更简单地编写可以由链接器自动生成的代码?
    • 如果你只有 1 个你想调用的函数就可以了……否则这是一个糟糕的选择,imo。
    • -1 - 对链接器中延迟加载的支持专门用于防止您不得不处理 LoadLibrary() 和 GetProcAddress()!
    • 在这个问题的情况下,(我们假设)他知道 DLL 将在 Windows 7 上可用,因此他可以在调用延迟加载的 DLL 的函数调用之前检测操作系统版本。但是,有时您无法知道系统上是否有 DLL 或可用的版本(以及哪些导出的函数)可用。在这些情况下,使用运行时动态链接是适当的解决方案,尽管这很乏味。如果您没有某种方式可以 100% 确定地检测 DLL 的存在和所需的导出函数,那么延迟加载可能只是延迟崩溃。
    • 我第二个 xtofl 和投标。使用运行时加载还有很多工作要做。
    猜你喜欢
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 2021-05-06
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    相关资源
    最近更新 更多