【发布时间】:2017-06-07 08:35:17
【问题描述】:
我们正在讨论什么是从一个 dll 函数返回多个字符串的好方法。目前我们有 8 个字符串,但还会有更多。为简单起见,我现在认为所有字符串的长度都相同。
extern "C" int DLLNAME_ _stdcall GetResult(TestResults* testResults);
在哪里
struct TestResults
{
int stringLengths;
char* string1;
char* string2;
char* string3;
char* string4;
...
};
或第二个选项:哪里
struct TestResults
{
int stringLengths;
char string1[64];
char string2[64];
char string3[64];
char string4[64];
...
};
第三个选项: extern "C" int DLLNAME_ _stdcall GetResult(int stringLengths, char* string1, char* string2, char* string3, ...);
dll 将通过串行线路进行通信并检索将填充到字符串中的信息。需要分配内存的地方有待讨论,可以作为答案的一部分。
背景是我们有一个喜欢第二种方法的 VB6 应用程序团队和一个喜欢第一种方法的 C++/C# 团队。最后一种方法看起来适合两个团队,但对我来说有这么多参数看起来有点奇怪。
也许还有更多选择。 Windows下的常见做法是什么?来自 Windows API 的任何示例或用于选择其中一个的参数?
编辑:字符串的含义与名字、姓氏、电子邮件一样。我们目前有八个,但将来我们可能会添加一对,例如地址。数组不是正确的选择,但从原始上下文中并不清楚。
【问题讨论】:
-
使用
char*,内存分配/释放是如何管理的?还将BSTR视为一种跨语言类型(具有定义的内存管理)。 -
我更新了问题以回答您的评论。我们没有严格的规则来说明分配需要在哪里进行。这可能是我们最终不知道什么是好的/常见的想法的部分原因。
-
如果您正在与 VB 6 进行互操作,您绝对应该使用
BSTR。这就是 VB 6 使用的字符串类型。在 .NET 应用程序中也能正常工作,因为它是标准 COM 类型。 -
或者您可以以
REG_MULTI_SZ的形式返回它 - 以空字符结尾的字符串序列,以空字符串 (\0) 结尾。下面是一个例子:String1\0String2\0String3\0LastString\0\0