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