延迟加载DLL(Delay Loading DLLs)

2019-07-05 07:51发布

我在急需帮助,我需要管理在Visual Studio中的应用程序的依赖。 该应用程序链接到一个DLL只在Windows的特定版本,可以说,Windows 7中和在其他环境中,DLL不应该被加载。 我将如何能够实现,使用DLL延迟加载,因为这题目是完全新的我并没有任何很好的参考网上的这一具体问题。

问候

Answer 1:

您的项目可以指定一个DLL它取决于应该,但在需要的时候被加载,通过在链接器/输入/延迟加载的dll字段中指定它。 此设置可以针对不同的生成配置不同。



Answer 2:

MSDN有一个很好的说明这里 。

基本上,你在做什么是settign有问题的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。

一个应用程序可以延迟加载时使用一个DLL / DELAYLOAD(延迟加载进口)与辅助功能(由Visual C ++提供的默认的实现)连接选项。 该辅助函数会被调用LoadLibrary和GetProcAddress为您加载在运行时的DLL。

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

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

在DLL中的函数可能不会被调用,直到你的程序的执行已晚。

一个DLL的延迟加载可以一个.exe或.dll项目的构建过程中指定。 延缓一个或多个DLL的加载一个.dll项目不应自称延迟加载入口点DllMain中。



Answer 3:

而不是使用延迟加载的,你有没有考虑过使用动态 加载与LoadLibraryGetProcAddress ? 这很可能是易于使用。

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


文章来源: Delay Loading DLLs