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