加载动态链接库的第三种方法?大头针
The third way to load Dynamic-Link Libraries? Pin
现在我可以用静态加载(包括必要的头,并使用#pragma comment(lib,"xxx"))和动态加载(使用LoadLibrary或LoadLibraryEx函数)加载动态链接库。
一些公司在采访中询问了加载动态链接库的其他方法。
但我想知道是否存在其他加载动态链接库的方法?
您的问题中存在术语混淆。DLL代表"动态链接库"。顾名思义,它们总是动态加载。它们不能静态加载。术语"静态"通常与静态库结合使用,即根本不是DLL的库。
DLL可以通过使用 因此,就这一点而言,加载DLL的主要方法仍然只有两种:显式和隐式。后一种加载方法恰好有两个子变体。有些人可能更喜欢将这种层次分类解释为平面分类,最终有三种链接/加载方法。 顺便说一句,隐式链接也是通过将导入库链接到程序中来实现的。"包含标题"本身并不能做到这一点。LoadLibrary
和GetProcAddress
函数(有时称为"运行时链接"或"手动链接")显式加载,也可以通过将所谓的导入库链接到程序中并以传统方式声明函数(有时也称为"加载时链接"answers"自动链接")隐式加载。后一种方法有两种:预加载和延迟加载
术语"加载"有点模糊。DLL永远不会被"加载"。术语"动态加载库"来自16位Windows时代。如今,DLL的内容通过分页被映射到内存中。因此,如果它们意味着通过加载将其内容复制到内存中,您甚至可以通过直接读取DLL来"加载"DLL。
如果它们意味着调用它们的函数,您也可以在"不"加载DLL的情况下这样做,例如使用rundll32.exe
(它将DLL映射到它自己的进程空间,而不是您的进程空间)。
当然,您可以通过分析DLL的PE结构初始化函数指针,调用DllMain()
并扫描其导出表,来模仿LoadLibrary
的操作。
另一种方法是延迟加载它们,这有点像静态链接,但dll不会加载,直到您实际调用驻留在其中的函数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 有没有一种方法可以在编译时获得作用域类名
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 哪种方法更好,性能明智
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- 多维数组存储三种不同的数据类型?
- 我想直接在结构中插入,但没有一种方法可以正确避免填充问题
- 当一种方法有三种返回可能性时该怎么办?
- 解释C 中三种返回类型的方法
- 如何使用“英特尔C++编译器”(ICC)在三种方法上使用SFINAE
- 加载动态链接库的第三种方法?大头针
- 创建一个有三种方法可供选择的加密程序!它有问题,我不知道如何解决
- 调用方法的这三种语法形式之间有什么区别?