【问题标题】:How to translate Delphi's “array of string” param to C++?如何将 Delphi 的“字符串数组”参数转换为 C++?
【发布时间】:2013-12-18 21:57:13
【问题描述】:

我正在尝试在我的 C++ 程序 (Visual Studio 2008) 中使用用 Delphi 编写的 DLL。 在 DLL 文档中函数声明为:

function ReadInfo(pRetBuffer: Pointer) : boolean;

where pRetBuffer - 指向返回结果的“字符串数组”类型变量的指针。 我应该如何在 C++ 中声明这个参数(字符串数组)?

在 DLL 的文档中,我有一个如何在 Delphi 中使用此函数的示例:

function ReadInfo(pRetBuffer: Pointer): boolean; stdcall; external 'SOME.dll'

var
   RetBuffer: array of string;
.
.
.

procedure Test();
var
   Result: Boolean;
begin
.
.
.
   Result := ReadInfo(@RetBuffer);
.
.
.
end;

【问题讨论】:

  • 从技术上讲,直译为std::string (*)[N](其中 N 是字符串的数量)。这是一个指向N 字符串数组的指针。但是,我怀疑这样做是个好主意。通常,您希望使用 stdlib 容器,例如 std::vector<std::string>

标签: c++ arrays delphi


【解决方案1】:

简单的答案是您不能从 C++ 调用该函数。 Delphi array of string 变量是 Delphi 私有的托管类型。您不能通过互操作边界传递其中之一。 Delphi 主机尝试调用该 DLL 函数甚至是可疑的。

您需要更改函数以使用有效的互操作类型。

您可以使用SAFEARRAY。您可以让 DLL 返回指向以空值结尾的 PChar 数组的指针。但是您随后需要导出一个释放器,或者从一个共享堆(例如 COM 堆)中分配。使用BSTR 执行此操作同时解决分配问题。

或者,正如您自己在 cmets 中建议的那样,您可以使用 Delphi DLL 作为桥梁。

【讨论】:

  • 感谢您的回答,但有没有办法在不更改 DLL 本身的情况下做到这一点?我无权访问 DLL 源 :(
  • 我的第一句话回答了这个问题。如果这确实是array of string,那么您无法从 C++ 访问它。 DLL 的作者为什么要这样做?
  • 不知道他为什么那样做 :) 在 DLL 的文档中,我在 Delphi 中有一个代码示例,如何调用这个函数,而且一切看起来都很简单......也许一个好的解决方案是写“过渡" Delphi 中的 DLL,所以我可以更改参数类型并从 c++ 中调用它们?
  • 我怀疑制作 Delphi 桥接 DLL 是唯一可行的方法。 .您需要确保使用相同版本的 Delphi,以便字符串类型兼容。如果您应该调用该函数的示例,这样我们可以确认它确实是array of string,这可能会有所帮助。
  • @user3000201:请提供在 Delphi 中工作的文档示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2016-11-20
相关资源
最近更新 更多