【问题标题】:What is the Delphi declaration for char***什么是 char 的 Delphi 声明***
【发布时间】:2015-11-29 18:24:11
【问题描述】:

我有一个基于 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 当然已经是一个指针,所以也许这就是我出错的地方。我尝试了许多变体,在纸上写下结构是什么,并逆向设计了 Delphi 声明,但无济于事。此 DLL 用于其他基于 C 的应用程序,因此我假设它的功能正常。

使用 XE6

【问题讨论】:

  • 这取决于char*** 代表什么。这可能是不同的事情。你必须阅读文档才能知道。
  • 没错,我应该更明确一点,在这种情况下 char*** 是一个指针,该指针指向一个数组,其中每个元素都指向一个字符串。但是给出的答案足以帮助我。

标签: delphi


【解决方案1】:

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

PPAnsiChar = ^PAnsiChar;
PPPAnsiChar = ^PPAnsiChar;

procedure Method(Arg: PPPAnsiChar); cdecl;

procedure Method(var Arg: PPAnsiChar); cdecl;

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

【讨论】:

  • 您的解决方案有效。在过去的一个小时里,我一直在为此苦苦挣扎。
【解决方案2】:

在这种情况下,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 循环,这应该是显而易见的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多