什么是char ***的Delphi声明

时间:2015-09-03 19:15:30

标签: delphi

我有一个基于C的DLL,它导出一个以char ***作为参数的函数,这是一个指向char指针的指针(非unicode)我的问题是,经过很多挫折之后,什么是Delphi端的等效声明?

我已尝试过例如:

 // C Method declaration
 void method (char*** arg)


 TArrayOfPAnsiChar = array of PAnsiChar;
 PArrayOfPAnsiChar = ^TArrayOfPAnsiChar;
 PPArrayOfPAnsiChar = ^PArrayOfPAnsiChar;

 // Delphi declaration
 procedure method (var p : PPArrayOfPAnsiChar); cdecl;

 p : PPArrayOfAnsiChar;
 method (p)

但我没有得到任何明智的回报。有什么建议?声明中的var当然已经是一个指针,所以也许就是我出错的地方。我尝试了很多变体,在纸上写下了结构是什么,反向设计了德尔福的解体,但无济于事。此DLL用于其他基于C的应用程序,因此我认为它的功能正常。

使用XE6

2 个答案:

答案 0 :(得分:11)

不要使用array of,因为它声明了一个动态数组,并使用AnsiChar而不是Char,因为后者在Delphi中是两个字节。

PPAnsiChar = ^PAnsiChar;
PPPAnsiChar = ^PPAnsiChar;

procedure Method(Arg: PPPAnsiChar); cdecl;

procedure Method(var Arg: PPAnsiChar); cdecl;

如果要像数组一样索引变量,请在声明类型之前添加{$POINTERMATH ON}

答案 1 :(得分:1)

  

在这种情况下,char ***是指向指向数组的指针,每个元素都指向一个字符串。

这意味着被调用者正在向调用者返回数据。所以你想使用:

procedure method(out Arg: PPAnsiChar); cdecl; external dllname;

其中PPAnsiChar^PAnsiChar。请注意,PPAnsiChar单位中定义了System

C代码有三个间接级别。最外层是函数如何将数据从被调用者传递给调用者。这表示为Delphi out参数。其余两个间接级别在PPAnsiChar中捕获。最后,C char在Windows上是8位类型,因此映射到AnsiChar

当函数返回时,您还需要遍历数组。像这样:

var
  StrArr: PPAnsiChar;
  Str: string;
....
method(StrArr);
while StrArr^ <> nil do
begin
  Str := StrArr^;
  Inc(StrArr);
end;

我假设数组的长度由终止空指针指示。如果你被告知长度,你使用for循环应该很明显。