GetProcAddress与链接器

时间:2013-06-17 23:26:39

标签: dll linker dynamic-linking getprocaddress

在对链接DLL进行一些研究之后,我遇到了两种不同的加载DLL的方法。

第一种方法是使用链接器。我添加了DLL的头和库的路径,并添加到链接器选项以链接它们。然后,我所要做的就是包含DLL的标题,并且它有效。

第二种方法是使用在 windows.h 标头中声明的 GetProcAdress 。这是通过创建 HINSTANCE 并使用 LoadLibrary(" mylib.dll")(或者无论DLL的名称是什么)来设置的。我正在链接)并将功能点设置为 GetProcAdress的地址(hInstance," myFunction")

这两项工作都有用,但我想知道哪种更常用,是一种更好的编程习惯。就此而言,哪种方法更快。

谢谢!

2 个答案:

答案 0 :(得分:1)

这两种方法都使用得非常广泛,而且两种方法都足够快,无法忽视它们的速度。

第一种方法"通过链接器",在程序启动时加载和链接DLL。如果缺少DLL,程序将无法启动,并且您无法控制此行为:这是操作系统加载可执行文件的方式。我说它的使用频率更高,因为它使用起来更简单。您只需添加一个库文件,不要担心其他任何事情,一切正常。

使用LoadLibrary的第二种方法可让您控制何时以及如何加载DLL;它允许您在程序运行时卸载和重新加载DLL,并且您的程序能够以您指定的方式处理丢失的DLL。但这需要更多努力(编写所有这些LoadLibraryGetProcAddress来电)。

哪种更好的编程实践取决于您使用DLL的方式(以及原因)。第一种方式涵盖了大多数情况。

答案 1 :(得分:1)

这两种方法都有利弊。 第一个可用于导出/导入C ++类。 使用LoadLibrary / GetProcAddress()很难做到这一点。

虽然第二种方法实际上仅限于导出/导入C函数, 它经常用于保持二进制兼容性。当您升级DLL添加新的导出函数,而无需重新编译依赖于DLL的应用程序时,您可以允许新DLL与旧应用程序一起使用。 使用第一种方法很难做到这一点。如果为导出的C ++类添加新的类成员函数,则需要 重新编译应用程序。如果不进行重新编译,您将看到通常很难调试的意外行为(例如,应用程序崩溃)。