我迫切需要帮助,我需要在 Visual Studio 中管理应用程序依赖项。应用程序仅在特定版本的 Windows(比如 Windows 7)上链接到 DLL。在其他环境中,不应加载 DLL。我将如何使用 DLL 延迟加载来实现这一点,因为这个主题对我来说是全新的,并且对于这个特定的问题没有任何好的在线参考资料。
问候
我迫切需要帮助,我需要在 Visual Studio 中管理应用程序依赖项。应用程序仅在特定版本的 Windows(比如 Windows 7)上链接到 DLL。在其他环境中,不应加载 DLL。我将如何使用 DLL 延迟加载来实现这一点,因为这个主题对我来说是全新的,并且对于这个特定的问题没有任何好的在线参考资料。
问候
您的项目可以通过在 Linker/Input/Delay Loaded DLLs 字段中指定它所依赖的 dll,但在需要时加载它。对于不同的构建配置,此设置可能不同。
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 中的延迟加载入口点。
您是否考虑过使用动态 加载而不是使用延迟加载?这可能更易于使用。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);