延迟加载 DLL

发布于 2024-08-04 05:40:20 字数 178 浏览 6 评论 0原文

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

问候

I am in desperate need of help, I need to manage an application dependency in Visual Studio. The application links to a DLL only on a specific version of windows, lets say Windows 7. and on other environments, the DLL should not be loaded. How will I be able to achieve that using DLL Delay Loading as this topic is completely new to me and there isn't any good references online for this particular matter.

Regards

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夜血缘 2024-08-11 05:40:20

您的项目可以通过在“链接器/输入/延迟加载的 DLL”字段中指定它来指定它所依赖的 dll 在需要时加载。对于不同的构建配置,此设置可能有所不同。

Your project can specify that a dll it depends upon should but be loaded when needed, by specifying it in the Linker/Input/Delay Loaded DLLs field. This setting can be different for different build configurations.

孤星 2024-08-11 05:40:20

MSDN 此处有一个很好的描述。

基本上,您所做的是将有问题的 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(延迟加载)延迟加载 DLL
导入)
带有辅助函数的链接器选项(默认实现
由 Visual C++ 提供)。辅助函数将在运行时加载 DLL
为您调用 LoadLibrary 和 GetProcAddress 的时间。

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

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

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

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

MSDN has a pretty good description here.

Basically what you are doing is setting the DLL in question to be in the delay load section. It will then not load that DLL until you make a call to a function that is in that DLL.

From the above link:

The Visual C++ linker now supports the delayed loading of DLLs. This
relieves you of the need to use the Windows SDK functions LoadLibrary
and GetProcAddress to implement DLL delayed loading.

Before Visual C++ 6.0, the only way to load a DLL at run time was by
using LoadLibrary and GetProcAddress; the operating system would load
the DLL when the executable or DLL using it was loaded.

Beginning with Visual C++ 6.0, when statically linking with a DLL, the
linker provides options to delay load the DLL until the program calls
a function in that DLL.

An application can delay load a DLL using the /DELAYLOAD (Delay Load
Import)
linker option with a helper function (default implementation
provided by Visual C++). The helper function will load the DLL at run
time by calling LoadLibrary and GetProcAddress for you.

You should consider delay loading a DLL if:

Your program may not call a function in the DLL.

A function in the DLL may not get called until late in your program's
execution.

The delayed loading of a DLL can be specified during the build of
either a .EXE or .DLL project. A .DLL project that delays the loading
of one or more DLLs should not itself call a delay-loaded entry point
in Dllmain.

甜警司 2024-08-11 05:40:20

您是否考虑过使用动态 使用 LoadLibrary< 加载/code> 和 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);

Instead of using delay loading, have you considered using dynamic loading with LoadLibrary and GetProcAddress? This is likely to be simpler to use.

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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文