当一个人应该隐式或明确地链接到DLL以及什么是常见的做法或陷阱?
答案 0 :(得分:8)
显式链接DLL是相当罕见的。主要是因为它很痛苦且容易出错。您需要为导出的函数编写函数指针声明,并获取LoadLibrary + GetProcAddress + FreeLibrary代码。只有当您需要对插件样式DLL的运行时依赖性或者希望根据配置从一组DLL中进行选择时,才会这样做。或者处理版本控制,这是一个仅在Windows的更高版本中可用的API函数。显式链接是COM和.NET DLL的默认链接。
此MSDN Library article中的更多背景信息。
答案 1 :(得分:5)
我同意已经回答你的其他人(Hans Passant和shoosh)。我想只添加两件事:
1)当您必须使用LoadLibrary
和GetProcAddress
时,有一个常见情况如下:您只想在新版本的Windows中使用一些新的API,但API并不重要应用。因此,您使用LoadLibrary
和GetProcAddress
测试是否存在您需要的函数,并在案例中使用它。如果功能不存在,您的程序所执行的操作完全取决于您的实现。
2)您的问题中没有包含一个重要选项:delayed loading of DLLs。在这种情况下,操作系统将在调用其中一个函数时加载DLL,而不是在应用程序启动时加载DLL。它允许在某些情况下使用导入库(.lib
文件),在这些情况下应该首先使用显式链接。此外,它还改善了应用程序的启动时间,并且被Windows本身广泛使用。所以也推荐这种方式。
答案 2 :(得分:4)
我假设你引用了使用.lib
与使用LoadLibrary()
动态加载DLL的链接。
通过链接到.lib
来静态加载DLL通常更安全。链接阶段检查编译时是否存在所有入口点,并且您没有机会加载没有您期望的函数的DLL。不必使用GetProcAddress()
也更容易。
因此,一般情况下,只有在绝对需要时才应使用动态加载。