c++ - 非托管 C++ : How to dynamically load code?

标签 c++ dll

我们的行业是高性能分布式并行计算。我们有一个使用 Visual Studio 2008 开发的非托管 C++ 应用程序。

我们的应用程序(更像是一个框架)应该能够动态加载3rd方(可以有很多dll)开发的符合我们接口(interface)规范的代码(算法),并调用加载的代码得到一些结果.

将其想象成您想调用 sin(x) 函数,但您可以使用 sin(x) 的许多不同实现。

我有几个问题,因为我对动态加载代码这个领域还很陌生:

  1. dll(动态链接库)是这类需求的答案吗?
  2. 如果第 3 方使用与我的不同类型的 IDE 来创建 dll(例如 Eclipse CDT、C++Builder、Visual C++ 6.0 等),该 dll 是否仍适用于我的应用程序?
  3. 我们的应用程序应该也可以跨平台工作(应该能够在 Linux 上运行),将使用 QLibrary是抽象所有特定于平台的 dll 加载的最合乎逻辑的方法吗?
  4. (可选)我可能会遇到一些无法预料的问题吗?

最佳答案

1) 一般来说,是的。如果 API 变得复杂和多对象,我会使用 COM 或类似的机制。但是,如果您只需要管理一点点状态,或者可以完全无状态,那么纯 DLL 接口(interface)就可以了。

2) 使用合适的调用约定 (stdcall) 和数据类型。我什至不认为实现必须在 C++ 中。所以这意味着 char/wchar_t,显式大小的整数,例如int32、float 和 double,以及它们的 C 风格数组。

3) 不能说

4) 没有跨界内存分配:释放你分配的东西,让插件释放它分配的东西。

您的 API 设计对可实现的性能和实现工作有很大影响。不要让功能变小,给实现一些自由,让它如何处理某些事情、定义错误协议(protocol)、线程要求等。

[编辑]
此外,如果您声明结构,请查看对齐和编译器选项来控制它(通常是#pragma pack)。这是必需的,以便客户看到相同的布局。

编译器通常会“破坏”导出符号的名称(例如,为 STDCALL 约定添加一个 udnerscore)。通常,这是通过传递给链接器的 .def 文件来控制的。

关于c++ - 非托管 C++ : How to dynamically load code?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1876415/

相关文章:

c++ - 在 Visual C++ 中使用 ffmpeg ffprobe

c++ - 使用 dllexport 和特定函数名称时未解析的外部符号

C++ 初学者 : expected unqualified-id before 'int'

c++ - 在 32 Borland C++ Builder 中使用 64 位 DLL

c++ - 使用 CreateRemoteThread API 时如何修复 "LPVOID: unknown size"错误?

c++ - QList 如何决定是存储指针还是存储项目本身?

c++ - 从构造函数参数初始化类初始化列表中的 const 多维数组

linux - 在 Linux/Unix 中转发 DLL 的等价物是什么?

delphi - 应用程序和 DLL 之间的共享 Firedac 连接中的事务

c# - SQLite 的 DLL hell