当一个应该隐式或显式链接到一个DLL,什么是常见的做法或陷阱?隐式链接到显式链接到DLL
回答
显式链接DLL是非常罕见的。主要是因为它很痛苦且容易出错。你需要为导出的函数编写一个函数指针声明,并获得LoadLibrary + GetProcAddress + FreeLibrary代码。只有在需要运行时依赖插件样式的DLL或者想根据配置从一组DLL中进行选择时,才会这样做。或者处理版本控制,例如,仅在更高版本的Windows上可用的API函数。显式链接是COM和.NET DLL的默认链接。
更多的背景资料在MSDN Library article。
我假设你指的是使用.lib
链接使用LoadLibrary()
动态加载DLL。
通过链接到其.lib
静态加载DLL通常更安全。链接阶段检查所有入口点是否在编译时存在,并且不可能加载没有你期望的函数的DLL。不需要使用GetProcAddress()
也更容易。
因此,一般来说,只有在绝对需要时才应使用动态加载。
我同意接受其他人的答复(Hans Passant和shoosh)。我想补充的只有两件事:
1)当你必须使用LoadLibrary
和GetProcAddress
一个常见的场景是:你想利用现有的仅适用于Windows的新版本一些新的API,但是API是不是关键的应用。所以你用LoadLibrary
和GetProcAddress
来测试你需要的函数是否存在,并在案例中使用它。如果函数不存在,你的程序做什么取决于你的实现。
2)有一个重要的选项,你不包括在你的问题:delayed loading of DLLs。在这种情况下,操作系统将在调用DLL的某个函数时加载DLL,而不是在应用程序启动时加载。它允许在一些情况下使用导入库(.lib
文件),在这种情况下应该首先使用显式链接。此外,它改善了应用程序的启动时间,并被Windows本身广泛使用。所以也推荐这种方式。
- 1. Delphi中的隐式链接与显式链接的DLL
- 2. 隐式链接DLL问题
- 3. 显式地链接类在DLL的
- 4. 正确链接到MapPoint DLL
- 5. 从MinGW链接到MSVC DLL
- 6. 直接链接到隐藏的div
- 7. PHP的正则表达式文本链接到HTML链接
- 8. 链接到链接到JS和CSS
- 9. 什么是在C#中的C++隐式链接DLL等价物?
- 10. 如果该链接链接到当前页面,则链接到目标链接?
- 11. PHP显示/隐藏链接
- 12. 显示/链接到PDF
- 13. 隐式链接和FreeLibrary在C#
- 14. gdi32.dll没有链接到Code :: Blocks?
- 15. 建立DLL并链接到它?
- 16. 将MATLAB链接到一个DLL库
- 17. 如何不链接到msvcr100.dll?
- 18. 如何链接到外部DLL工作?
- 19. 如何将dll链接到fortran(visual studio)?
- 20. MSVC - boost :: python静态链接到.dll(.pyd)
- 21. 将64位DLL链接到Visual Basic 6
- 22. 如何将.dll链接到Visual Studio 2008?
- 23. 隐藏符号链接文件夹到硬链接文件夹
- 24. 样式表不会链接到htm
- 25. 用Django链接到样式表
- 26. 将word格式链接到excel
- 27. jQuery的 - Youtube链接到嵌入式
- 28. 将样式添加到活动链接?
- 29. 将样式表链接到ID
- 30. CSS样式表没有链接到HTML
你的意思是显式还是隐式?你的意思是使用LoadLibrary或静态链接? – tenfour 2011-01-25 13:35:07
@tenfour隐式是当您使用.h并且需要分别链接到.lib和显式时使用LoadLibrary和GetProcAddress。静态连接是另一种口香糖。 – Shinnok 2011-01-25 14:01:42