Dll GetProcAddress与链接器

Dll GetProcAddress与链接器,dll,linker,dynamic-linking,getprocaddress,Dll,Linker,Dynamic Linking,Getprocaddress,在对链接DLL进行了一些研究之后,我发现了两种不同的加载DLL的方法 第一种方法是使用链接器。我将路径添加到DLL的头和库,并添加到链接器选项以链接它们。然后我所要做的就是包含DLL的头文件,它就可以工作了 第二个方法是使用在windows.h头中声明的getprocadres。通过创建HINSTANCE并使用LoadLibrary(“mylib.dll”)(或我正在链接的dll的名称)设置它,然后将函数点设置为GetProcAddress的地址(HINSTANCE,“myFunction”)

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

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

第二个方法是使用在windows.h头中声明的getprocadres。通过创建HINSTANCE并使用LoadLibrary(“mylib.dll”)(或我正在链接的dll的名称)设置它,然后将函数点设置为GetProcAddress的地址(HINSTANCE,“myFunction”)

这两种方法都有效,但我想知道哪种方法更常用,哪种编程方法更好。至于问题,哪种方法更快


谢谢

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

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

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


哪种编程实践更好取决于您如何(以及为什么)使用DLL。第一种方法涵盖了大多数情况。

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

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

最常用的方法是不那么痛苦的方法。显然,你应该有一个好主意,哪一个更痛苦:)