我正在使用 Code::Blocks 并且讨厌手动链接 DLL。我找到了这个LoadLibrary()
函数,想知道它是否像.a
or.lib
文件那样工作。这个功能是这样工作的吗?如果没有,我可以在编程方面(如果有的话)做什么来链接 DLL 而不必通过执行该Project < Build options < Linker settings < add < ...
方法来链接 DLL?
4 回答
LoadLibrary
将请求的库(以及它需要的所有库)加载到进程的地址空间中。为了访问该库中的任何代码/数据,您需要找出新加载的内存区域中的代码或数据地址。你需要使用GetProcAddress
.
此过程与在构建时添加库之间的区别在于,对于构建时库,编译器准备一个引用给定函数的位置列表,链接器将该列表放入 .exe,运行时链接器加载该库,对函数名执行等效的操作GetProcAddress
,并将地址放入编译器标记的所有位置。
当您没有这种自动支持时,您必须声明一个指向函数的指针,调用GetProcAddress
自己,并将返回的值分配给您的函数指针。然后,您可以像调用任何其他 C 函数一样调用该函数(注意“C”部分 - 当您使用 C++ 时,上述过程因名称修改而变得复杂,因此请使用extern "C"
)
根本不是它的工作原理。LoadLibrary
用于加载“在编译时未知”的 DLL - 例如程序扩展/插件或“此 DLL 用于 SSE,该 DLL 用于非 SSE”基于“硬件可以做什么 - 也可以考虑每个 DLL到电子邮件服务器的连接类型或类似的东西,以便电子邮件程序不必“携带”所有不同的变体,当只有一个用于任何特定的电子邮件地址时。
此外,要使用以这种方式加载的 DLL,您需要使用GetProcAddress
获取 DLL 中函数的地址。这与在构建时将 DLL 链接到项目中非常不同,其中函数只是通过系统加载器函数“自动”出现,这些加载器函数加载在构建时添加到项目中的 DLL。
与静态或动态库链接相反,LoadLibrary
它不会使库的符号直接可用于您的程序。您需要GetProcAddress
在运行时调用以获取指向要调用的函数的指针。
正如@Devolus 提到的,这是实现插件系统和/或访问可选组件的好方法。但是,由于您的程序无法以透明的方式使用这些符号,因此这对于普通用途来说并不实用。
LoadLibrary()
在运行时加载 DLL。通常在编译 EXE 时链接,此时链接 DLL 就像静态库一样。如果您需要在运行时动态加载库,请使用LoadLibrary()
.
例如,当您实现插件系统时,这是否有用,因为您事先不知道库。