Winapi 隐式与显式链接到DLL

Winapi 隐式与显式链接到DLL,winapi,dll,dllimport,windows,Winapi,Dll,Dllimport,Windows,什么时候应该隐式或显式链接到DLL,常见的做法或陷阱是什么?我假设您指的是使用.lib链接,而不是使用LoadLibrary()动态加载DLL 通过链接到DLL的.lib静态加载DLL通常更安全。链接阶段检查所有入口点是否存在于编译时,并且不可能加载没有预期功能的DLL。不必使用GetProcAddress()也更容易 因此,通常只有在绝对需要动态加载时才应使用动态加载。显式链接DLL的情况非常少见。主要是因为这很痛苦而且容易出错。您需要为导出的函数编写函数指针声明,并正确获取LoadLibra

什么时候应该隐式或显式链接到DLL,常见的做法或陷阱是什么?

我假设您指的是使用
.lib
链接,而不是使用
LoadLibrary()
动态加载DLL

通过链接到DLL的
.lib
静态加载DLL通常更安全。链接阶段检查所有入口点是否存在于编译时,并且不可能加载没有预期功能的DLL。不必使用
GetProcAddress()
也更容易


因此,通常只有在绝对需要动态加载时才应使用动态加载。

显式链接DLL的情况非常少见。主要是因为这很痛苦而且容易出错。您需要为导出的函数编写函数指针声明,并正确获取LoadLibrary+GetProcAddress+FreeLibrary代码。只有在需要插件式DLL的运行时依赖项或希望根据配置从一组DLL中进行选择时,才会这样做。或者处理版本控制,例如,一个仅在Windows的更高版本上可用的API函数。显式链接是COM和.NET DLL的默认链接


更多背景信息。

我同意其他已经回答你的人(汉斯·帕桑和肖什)。我只想补充两件事:

1) 当您必须使用
LoadLibrary
GetProcAddress
时,一个常见的场景是:您只想使用新版本Windows中存在的一些新API,但API在您的应用程序中并不重要。因此,您可以使用
LoadLibrary
GetProcAddress
测试您需要的函数是否存在,并在案例中使用它。如果函数不存在,程序会做什么取决于您的实现


2) 有一个重要选项未包含在问题中:。在这种情况下,操作系统将在调用其函数之一而不是在应用程序启动时加载DLL。它允许在某些场景中使用导入库(
.lib
文件),在这些场景中,第一眼就应该使用显式链接。此外,它提高了应用程序的启动时间,并被Windows本身广泛使用。因此,我们也推荐这种方法。

你所说的显式与隐式是什么意思?你是说使用LoadLibrary还是静态链接?@tenfour implicit是指当你使用.h时,需要链接到.lib;当你分别使用LoadLibrary和GetProcAddress时,需要链接到显式。静态链接是另一种口香糖。有时在手头没有.lib文件时使用显式链接。我知道MSDN说“隐式链接有时被称为静态加载”,但说DLL的静态链接非常令人困惑。延迟加载是由Visual Studio链接器实现的,而不是由操作系统实现的。它为您插入相应的
LoadLibrary
GetProcAddress
调用。操作系统不知道是谁打了这些电话。这就是为什么它可以回到windows95,即使该功能是在98年引入的。@MSalters:你错了。延迟加载使用的程序可执行文件(PE)具有附加的
图像\u目录\u条目\u延迟\u导入
部分。