2011-01-25 72 views
7

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

+1

你的意思是显式还是隐式?你的意思是使用LoadLibrary或静态链接? – tenfour 2011-01-25 13:35:07

+1

@tenfour隐式是当您使用.h并且需要分别链接到.lib和显式时使用LoadLibrary和GetProcAddress。静态连接是另一种口香糖。 – Shinnok 2011-01-25 14:01:42

回答

8

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

更多的背景资料在MSDN Library article

4

我假设你指的是使用.lib链接使用LoadLibrary()动态加载DLL。

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

因此,一般来说,只有在绝对需要时才应使用动态加载。

5

我同意接受其他人的答复(Hans Passant和shoosh)。我想补充的只有两件事:

1)当你必须使用LoadLibraryGetProcAddress一个常见的场景是:你想利用现有的仅适用于Windows的新版本一些新的API,但是API是不是关键的应用。所以你用LoadLibraryGetProcAddress来测试你需要的函数是否存在,并在案例中使用它。如果函数不存在,你的程序做什么取决于你的实现。

2)有一个重要的选项,你不包括在你的问题:delayed loading of DLLs。在这种情况下,操作系统将在调用DLL的某个函数时加载DLL,而不是在应用程序启动时加载。它允许在一些情况下使用导入库(.lib文件),在这种情况下应该首先使用显式链接。此外,它改善了应用程序的启动时间,并被Windows本身广泛使用。所以也推荐这种方式。