延迟加载DLL

时间:2009-09-07 09:17:02

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

我迫切需要帮助,我需要在Visual Studio中管理应用程序依赖项。应用程序仅在特定版本的Windows上链接到DLL,例如Windows 7.在其他环境中,不应加载DLL。我将如何使用DLL Delay Loading实现这一目标,因为这个主题对我来说是全新的,并且没有任何关于此特定事项的在线参考。

此致

3 个答案:

答案 0 :(得分:11)

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。

答案 1 :(得分:8)

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

答案 2 :(得分:2)

您是否考虑过将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);