gpt4 book ai didi

delphi - 如何将 C++ char** 翻译成 Delphi?

转载 作者:行者123 更新时间:2023-12-03 19:14:43 24 4
gpt4 key购买 nike

我有一个 C++ DLL:

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

而且我不知道如何翻译这个字符**。
我试过:
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]);

但我得到的只是“访问冲突”

最佳答案

从表面上看,鉴于问题中的信息,您的代码似乎基本没问题。然而,许多互操作初学者犯的一个菜鸟错误是相信一个函数的签名足以定义接口(interface)。它不是。例如,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]若你宁可。我更喜欢强制转换,因为即使启用了范围检查,它也允许我传递一个空数组。

    请注意,我使用了 PAnsiChar匹配 char* . PChar type 是 PAnsiChar 的别名或 PWideChar取决于 Delphi 版本。最好是明确的。

    当然,我的假设可能是错误的。您应该通过查阅图书馆的文档来确认它们。

    关于delphi - 如何将 C++ char** 翻译成 Delphi?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33053014/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com