簡體   English   中英

什么是char ***的Delphi聲明

[英]What is the Delphi declaration for char***

我有一個基於C的DLL,可導出一個以char ***作為參數的函數,這是一個指向char指針的指針(非unicode)。我的問題是,在無奈之下,等效聲明是什么?在德爾福盡頭?

我嘗試過例如:

 // 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

不要使用array of ,因為它聲明了動態數組,請使用AnsiChar而不是Char ,因為后者在Delphi中是兩個字節。

PPAnsiChar = ^PAnsiChar;
PPPAnsiChar = ^PPAnsiChar;

procedure Method(Arg: PPPAnsiChar); cdecl;

要么

procedure Method(var Arg: PPAnsiChar); cdecl;

如果要像數組一樣索引到變量中,請在聲明類型之前添加{$POINTERMATH ON}

在這種情況下,char ***是指向一個指針的指針,該指針指向一個數組,每個元素都指向一個字符串。

這意味着被呼叫者正在將數據返回給呼叫者。 所以你要使用:

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

其中PPAnsiChar^PAnsiChar 注意, PPAnsiCharSystem單元中定義。

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循環,這應該是顯而易見的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM