gpt4 book ai didi

c++ - 从 DLL 导出 C++ 类

转载 作者:太空宇宙 更新时间:2023-11-04 13:30:06 26 4
gpt4 key购买 nike

我的大部分 C/C++ 开发涉及整体模块文件,绝对没有任何类,所以通常当我需要制作一个具有可访问功能的 DLL 时,我只是使用标准 __declspec 导出它们(dllexport) 指令。然后通过 LoadLibrary() 动态访问它们,或者在编译时使用头文件和 lib 文件访问它们。

当您想导出整个类(及其所有公共(public)方法和属性)时,您如何做到这一点?

是否可以在运行时动态加载该类,如果可以,如何加载?

如何使用 header 和库来进行编译时链接?

最佳答案

What about late-binding? As in loading it with LoadLibrary() and GetProcAddress() ? I'm used being able to load the library at run time and it would be great if you could do that here.

所以加载DLL的方式有两种。第一种是引用 DLL 中的一个或多个符号(例如,您的类名),提供适当的导入 .LIB 并让链接器解决所有问题。

第二种是通过 LoadLibrary 显式加载 DLL。

这两种方法都适用于 C 级函数导出。您可以让链接器处理它,也可以按照您的说明调用 GetProcAddress。

但是当谈到导出的时,通常只使用第一种方法,即隐式链接到 DLL。在这种情况下,DLL 在应用程序启动时加载,如果找不到 DLL,应用程序将无法加载。

如果您想链接到 DLL 中定义的类,并且您希望动态加载该 DLL,则在程序启动后的某个时间,您有两个选择:

  1. 使用特殊的工厂函数创建类的对象,该函数在内部必须使用(一点点)汇编器将新创建的对象“连接”到它们适当的偏移量。显然,这必须在加载 DLL 之后在运行时完成。可以找到对这种方法的很好解释 here .

  2. 使用 delay-load DLL .

综合考虑……可能最好只使用隐式链接,在这种情况下,您肯定想使用上面显示的预处理器技术。事实上,如果您在 Visual Studio 中创建一个新的 DLL 并选择“导出符号”选项,将为您创建这些宏。

祝你好运......

关于c++ - 从 DLL 导出 C++ 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31852938/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com