现在我可以使用静态加载(包括必要的标题,并使用#pragma 注释(lib,“xxx”))和动态加载(使用函数 LoadLibrary 或 LoadLibraryEx)加载动态链接库。
一些公司在他们的面试中询问加载动态链接库的其他方法。
但我想知道是否存在其他加载动态链接库的方法?
现在我可以使用静态加载(包括必要的标题,并使用#pragma 注释(lib,“xxx”))和动态加载(使用函数 LoadLibrary 或 LoadLibraryEx)加载动态链接库。
一些公司在他们的面试中询问加载动态链接库的其他方法。
但我想知道是否存在其他加载动态链接库的方法?
您的问题中有一个术语混淆。DLL 代表“动态链接库”。顾名思义,它们总是动态加载的。它们不能静态加载。术语“静态”通常与静态库一起使用,即根本不是 DLL 的库。
DLL 可以通过使用和函数显式加载(有时称为“运行时链接”或“手动链接”)或通过将所谓的导入库链接到程序中并以常规方式声明函数(有时称为“加载时链接”)来隐式加载”或“自动链接”)。后一种方法有两种:pre-load和delay-load。预加载的 DLL 会在程序开始时立即无条件地加载。延迟加载的 DLL 在(如果)首次使用时被加载。LoadLibrary
GetProcAddress
因此,在这个术语中,加载 DLL 的主要方式仍然只有两种:显式和隐式。后一种加载方法恰好有两个子品种。有些人可能更愿意将这种分层分类解释为扁平分类,最终得到三种链接/加载方法。
顺便说一句,通过将导入库链接到您的程序中,再次实现了隐式链接。“包括标题”本身不会这样做。
“加载”一词有点含糊。DLL 永远不会被“加载”。术语“动态加载库”来自 16 位 Windows 时代。今天,DLL 的内容使用分页映射到内存中。因此,如果他们的意思是通过加载将其内容复制到内存中,您甚至可以通过直接读取 DLL 来“加载”它。
如果他们的意思是调用他们的函数,你也可以“不”加载 DLL,例如通过使用rundll32.exe
(它将 DLL 映射到它自己的进程空间,而不是你的)。
你当然可以通过分析 DLL 的 PE 结构、调用和扫描它的导出表LoadLibrary
来初始化函数指针来模仿。DllMain()
另一种方法是延迟加载它们,这有点像静态链接,但在您实际调用驻留在其中的函数之前,不会加载 dll