【发布时间】:2020-10-23 03:54:18
【问题描述】:
我对 C++ 和使用 DLL 相当陌生。我有一个主要应用程序,它汇总了不同测量的结果。由于测量值因情况而异,我决定将它们放入外部 DLL 中,以便它们可以在运行时加载(它们都只是导出相同的函数)。我们的想法是像这样加载它们,以便可以根据运行时需要扩展聚合器:
typedef int (*measure)(measurement &dataHolder);
int callM() {
[...]
measurement dataHolder;
lib = LoadLibraryA("measureDeviceTypeA.dll");
measure measureFunc = (measure)GetProcAddress(lib, "measureFunc");
pluginFunc(dataHolder);
[...] // close the lib and load the next one depending on found Devices
}
这对于简单的数据类型(取决于结构“测量”的实际定义)非常有效,例如:
typedef struct measurement {
DWORD realPBS;
DWORD imaginaryPBS;
int a;
} measurement;
现在也可能有任意长度的字符串(结果的字符表示)。我也想将它们放入测量结构中,并将它们填充到 DLL 中的实际工作函数中。我的第一个假设是只使用 std::string 会很容易,它有时有效,有时无效(因为它会在 std::string().append() 上重新分配内存,这可能会中断(访问冲突),具体取决于程序的实际运行时环境和dll)。我读到 here 和 here 说从函数返回字符串是个坏主意。
那么从这样的调用中返回任意长度字符串的“正确”C++ 方式是什么?将结构传递给 DLL 是否有帮助,还是应该将其拆分为单独的调用?当我再次关闭 DLL 时,我不想让指针悬空或释放内存。
【问题讨论】:
-
C++ 不支持任何平台上的不兼容运行时。如果是这种情况,您应该避免在外部接口中使用任何 C++ 对象。
-
问题是,字符串数据通常分配在堆上,所以必须以某种方式释放/管理。