隐式与显式链接到DLL

Shi*_*nok 7 windows dll winapi dllimport

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

Han*_*ant 9

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

MSDN Library文章中的更多背景信息.


sho*_*osh 5

我假设您指的是使用.libvs 进行链接,而vs则使用动态加载DLL LoadLibrary()

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

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


Ole*_*leg 5

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

1)当你必须使用一个常见的场景LoadLibrary,并GetProcAddress在以下:您要使用现有的仅适用于Windows的新版本一些新的API,但是API不是你的应用程序的关键.所以,你用测试LoadLibraryGetProcAddress是否你需要存在的功能,并且在情况下使用它.如果函数不存在,您的程序所执行的操作完全取决于您的实现.

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