我有一个基于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
答案 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循环应该很明显。