隐式与显式链接到一个DLL

什么时候应该隐式地或者明确地链接到一个DLL,什么是常见的做法或者陷阱?

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

本MSDN库文章中的更多背景信息。

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

1)当你不得不使用LoadLibraryGetProcAddress时,一个常见的情况是:你只想在新版本的Windows中使用一些新的API,但是API在你的应用程序中并不重要。 所以你用LoadLibraryGetProcAddress测试你需要的函数是否存在,并在案例中使用它。 如果函数不存在,你的程序做什么取决于你的实现。

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

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

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

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