簡體   English   中英

如何將C ++ char **轉換為Delphi?

[英]How to translate C++ char** to Delphi?

我有一個C ++ DLL:

int __stdcall Hello(int numFiles, char **inFiles)

而且我不知道如何翻譯此char **。 我試過了:

function Hello(numFiles: Integer; InFiles: PPChar): Integer; stdcall; external 'dll2.dll';

接着:

    Files: array of PChar;
begin
   SetLength(Files, 2);
   Files[0] := PChar('siema.jpg');
   Files[1] := PChar('siema2.jpg');

   c := Hello(2, @Files[0]);

但我得到的只是“訪問沖突”

從表面上看,鑒於問題中的信息,您的代碼似乎基本正常。 但是,許多初學者使用互操作性會犯一個新手錯誤,那就是認為函數的簽名足以定義接口。 它不是。 例如, char**類型的參數可用於許多不同的事物。 因此,要指定信息,還必須指定參數的語義,而不僅僅是語法。

給定

int __stdcall Hello(int numFiles, char **inFiles)

讓我們假設以下內容:

  • 返回值為錯誤代碼, 0表示成功。
  • 第一個參數是文件數。
  • 第二個參數是文件數組,其長度由第一個參數指定。 數組的每個元素都是一個C字符串,它是一個以8位字符為結尾的空終止數組的指針。

有了這些假設,我將編寫如下代碼:

function Hello(numFiles: Integer; InFiles: PPAnsiChar): Integer; stdcall;
  external 'dll2.dll';

該函數將被這樣調用:

var
  Files: array of PAnsiChar;
  retval: Integer;
....
SetLength(Files, 2);
Files[0] := PAnsiChar('siema.jpg');
Files[1] := PAnsiChar('siema2.jpg');
retval := Hello(Length(Files), PPAnsiChar(Files));
if retval <> 0 then
  ... handle error

如果願意,您可能希望將最終參數寫為@Files[0] 我更喜歡強制轉換,因為即使啟用了范圍檢查,它也允許我傳遞一個空數組。

請注意,我使用PAnsiCharchar*匹配。 根據Delphi版本, PChar類型是PAnsiCharPWideChar的別名。 最好是明確的。

當然,我的假設可能是錯誤的。 您應該通過查閱圖書館的文件進行確認。

暫無
暫無

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

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