[英]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
表示成功。 有了這些假設,我將編寫如下代碼:
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]
。 我更喜歡強制轉換,因為即使啟用了范圍檢查,它也允許我傳遞一個空數組。
請注意,我使用PAnsiChar
與char*
匹配。 根據Delphi版本, PChar
類型是PAnsiChar
或PWideChar
的別名。 最好是明確的。
當然,我的假設可能是錯誤的。 您應該通過查閱圖書館的文件進行確認。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.