隐式与显式链接到DLL

时间:2011-01-25 13:26:00

标签: winapi dll dllimport windows

当一个人应该隐式或明确地链接到DLL以及什么是常见的做法或陷阱?

3 个答案:

答案 0 :(得分:8)

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

MSDN Library article中的更多背景信息。

答案 1 :(得分:5)

我同意已经回答你的其他人(Hans Passant和shoosh)。我想只添加两件事:

1)当您必须使用LoadLibraryGetProcAddress时,有一个常见情况如下:您只想在新版本的Windows中使用一些新的API,但API并不重要应用。因此,您使用LoadLibraryGetProcAddress测试是否存在您需要的函数,并在案例中使用它。如果功能不存在,您的程序所执行的操作完全取决于您的实现。

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

答案 2 :(得分:4)

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

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

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