0

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

第一种方法是使用链接器。我添加了 DLL 头文件和库的路径,并添加到链接器选项以链接它们。然后我所要做的就是包含 DLL 的头文件,它就可以工作了。

第二种方法是使用在windows.h标头中声明的GetProcAdress。这是通过创建一个HINSTANCE并使用LoadLibrary("mylib.dll")(或我要链接的任何 DLL 名称)设置它并将函数点设置为GetProcAdress(hInstance, "myFunction")的地址来完成的。

这两项工作,但我想知道哪个更常用并且是更好的编程实践。对于此事,哪种方法更快。

谢谢!

4

2 回答 2

1

这两种方法都被广泛使用,并且都足够快,可以忽略它们的速度。

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

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

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

于 2013-06-17T23:37:52.897 回答
1

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

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

于 2013-10-05T03:48:29.463 回答