加载动态链接库的第三种方法?大头针

The third way to load Dynamic-Link Libraries? Pin

本文关键字:三种 方法 大头针 动态链接库 加载      更新时间:2023-10-16

现在我可以用静态加载(包括必要的头,并使用#pragma comment(lib,"xxx"))和动态加载(使用LoadLibrary或LoadLibraryEx函数)加载动态链接库。

一些公司在采访中询问了加载动态链接库的其他方法。

但我想知道是否存在其他加载动态链接库的方法?

您的问题中存在术语混淆。DLL代表"动态链接库"。顾名思义,它们总是动态加载。它们不能静态加载。术语"静态"通常与静态库结合使用,即根本不是DLL的库。

DLL可以通过使用LoadLibraryGetProcAddress函数(有时称为"运行时链接"或"手动链接")显式加载,也可以通过将所谓的导入库链接到程序中并以传统方式声明函数(有时也称为"加载时链接"answers"自动链接")隐式加载。后一种方法有两种:预加载延迟加载

因此,就这一点而言,加载DLL的主要方法仍然只有两种:显式和隐式。后一种加载方法恰好有两个子变体。有些人可能更喜欢将这种层次分类解释为平面分类,最终有三种链接/加载方法。

顺便说一句,隐式链接也是通过将导入库链接到程序中来实现的。"包含标题"本身并不能做到这一点。

术语"加载"有点模糊。DLL永远不会被"加载"。术语"动态加载库"来自16位Windows时代。如今,DLL的内容通过分页被映射到内存中。因此,如果它们意味着通过加载将其内容复制到内存中,您甚至可以通过直接读取DLL来"加载"DLL。

如果它们意味着调用它们的函数,您也可以在"不"加载DLL的情况下这样做,例如使用rundll32.exe(它将DLL映射到它自己的进程空间,而不是您的进程空间)。

当然,您可以通过分析DLL的PE结构初始化函数指针,调用DllMain()并扫描其导出表,来模仿LoadLibrary的操作。

另一种方法是延迟加载它们,这有点像静态链接,但dll不会加载,直到您实际调用驻留在其中的函数