gpt4 book ai didi

c++ - 如何安全地从DLL调用返回对象

转载 作者:行者123 更新时间:2023-12-02 10:00:33 26 4
gpt4 key购买 nike

我对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中的实际worker函数中。我的第一个假设是,仅使用std::string会很容易,它有时会起作用,有时不会起作用(因为它将在 std::string().append()上重新分配内存,并且这可能会中断(访问冲突),具体取决于程序的实际运行时环境和dll)。我读了 herehere,从函数返回一个字符串是一个坏主意。
那么从这样的调用返回任意长度字符串的“正确” C++方法是什么?将结构传递给DLL是否有帮助,还是应该将其拆分为单独的调用?当我再次关闭DLL时,我不想让指针悬空或释放内存。

最佳答案

正如Dani在评论中指出的那样,这不适用于std::string。问题在于std::string是属于您的实现的类型,并且不同的C++实现具有不同的std::string
对于DLL(Microsoft)来说,确实有另一种选择。 COM是一项古老的技术,但今天它仍然有效,而且永远不会消失。它具有自己的字符串类型BSTR。 Visual Studio为您自己的代码提供了一个辅助C++类 bstr_t ,但是在界面上,您将使用BSTR中的普通_bstr_t::GetBSTRBSTR依赖于Windows分配器SysAllocStringOleAut32.dll

关于c++ - 如何安全地从DLL调用返回对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62698206/

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