我急需帮助,需要在Visual Studio中管理应用程序依赖项。该应用程序链接到一个仅适用于特定版本的Windows(比如Windows 7)的DLL文件,在其他环境中该DLL文件不应该被加载。作为一个完全陌生的话题,我要如何使用DLL延迟加载来实现这一点,因为网络上没有关于这个特定问题的良好参考。
谢谢
我急需帮助,需要在Visual Studio中管理应用程序依赖项。该应用程序链接到一个仅适用于特定版本的Windows(比如Windows 7)的DLL文件,在其他环境中该DLL文件不应该被加载。作为一个完全陌生的话题,我要如何使用DLL延迟加载来实现这一点,因为网络上没有关于这个特定问题的良好参考。
谢谢
MSDN在这里提供了非常好的解释。
基本上,你需要将相关的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中的函数才加载。
应用程序可以使用帮助函数(由Visual C++提供默认实现)和/DELAYLOAD(延迟载入导入) 链接器选项来延迟加载DLL。帮助函数将通过调用LoadLibrary和GetProcAddress在运行时加载DLL。
如果:
程序可能不会调用DLL中的某个函数。
直到程序的执行较晚时才调用DLL中的函数。
您应该考虑延迟加载DLL。DLL的延迟加载可以在.EXE或.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);