10

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

问候

4

3 回答 3

11

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

于 2009-09-07T09:26:13.120 回答
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(延迟加载导入)链接器选项和辅助函数(Visual C++ 提供的默认实现)延迟加载 DLL。帮助函数将在运行时通过为您调用 LoadLibrary 和 GetProcAddress 来加载 DLL。

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

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

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

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

于 2009-09-07T09:31:07.013 回答
2

您是否考虑过使用动态 加载而不是使用延迟加载?这可能更易于使用。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);
于 2009-09-07T09:27:57.683 回答