C++ 延迟加载DLL

C++ 延迟加载DLL,c++,windows,visual-studio,dll,delayed-execution,C++,Windows,Visual Studio,Dll,Delayed Execution,我急需帮助,我需要在VisualStudio中管理应用程序依赖关系。该应用程序仅在特定版本的windows(比如windows 7)上链接到DLL。在其他环境中,不应加载DLL。我如何才能实现使用DLL延迟加载,因为这个主题对我来说是全新的,而且在网上没有任何关于这个特定问题的好参考 关于您的项目可以通过在Linker/Input/Delay-loaded-DLLs字段中指定它所依赖的dll,但在需要时加载它。对于不同的生成配置,此设置可能不同。您是否考虑过与LoadLibrary和GetPro

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


关于

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

您是否考虑过与
LoadLibrary
GetProcAddress
一起使用,而不是使用延迟加载?这可能更易于使用

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);

MSDN有一个很好的描述

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

从以上链接:

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

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

应用程序可以使用带有辅助函数的链接器选项延迟加载DLL(默认实现) 由Visual C++提供)。helper函数将在运行时加载DLL 通过调用LoadLibrary和GetProcAddress为您计时

你应该考虑延迟加载一个DLL,如果:

您的程序可能无法调用DLL中的函数

DLL中的函数在程序运行的后期才可能被调用 执行

DLL的延迟加载可在生成过程中指定 .EXE或.DLL项目。延迟加载的.DLL项目 一个或多个DLL本身不应调用延迟加载的入口点 在德勒曼


Thx的回复人,但你能给我一个例子或代码片段,如果它适用:)这是延迟加载的点:这是一个配置的事情,而不是一个代码的事情。措辞似乎是错误的:当你说“你所依赖的DLL应该与延迟加载容量链接”,您似乎指的是从其组成部分.obj创建该DLL。/DELAY标志实际上应用于执行导入的模块,而不是导入的模块。这也是您可以延迟加载Windows 2000 dll的原因,如果没有此支持,将生成Windows 2000 dll。@mAlters:您是对的:第一个选项是dll支持卸载。对此进行了更正,谢谢。如何编写链接器自动生成的代码更简单?如果您只想调用1个函数,那就好了。。。否则,这显然是一个错误的选择,imo.-1-在链接器中支持延迟加载是为了防止您必须处理LoadLibrary()和GetProcAddress()!在这个问题中,(我们假设)他知道DLL将在Windows7上可用,因此他可以在调用delayloaded DLL的函数调用之前检测OS版本。但是,有时您不知道系统上是否有DLL,或者什么版本(以及导出的函数)可用。在这些情况下,使用运行时动态链接是一个适当但繁琐的解决方案。如果您无法以某种方式100%确定地检测DLL和所需导出函数的存在,那么延迟加载可能只是延迟崩溃。使用运行时加载还有很多工作要做。您是在问延迟加载是如何工作的,还是如何应用它?