如何将C++ char**翻译为Delphi?

Tom*_*Tom 1 delphi dll

我有一个C++ DLL:

int __stdcall Hello(int numFiles, char **inFiles)
Run Code Online (Sandbox Code Playgroud)

我不知道如何翻译这个字符**.我试过了:

function Hello(numFiles: Integer; InFiles: PPChar): Integer; stdcall; external 'dll2.dll';
Run Code Online (Sandbox Code Playgroud)

然后:

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

   c := Hello(2, @Files[0]);
Run Code Online (Sandbox Code Playgroud)

但我得到的只是"访问违规"

Dav*_*nan 5

从表面上看,根据问题中的信息,你的代码似乎基本上没问题.然而,许多初学者使用interop制作的新手错误是相信函数的签名足以定义界面.它不是.例如,类型的参数char**可以用于许多不同的事情.因此,要指定信息,还必须指定参数的语义,而不仅仅是语法.

特定

int __stdcall Hello(int numFiles, char **inFiles)
Run Code Online (Sandbox Code Playgroud)

让我们假设以下内容:

  • 返回值是错误代码,0表示成功.
  • 第一个参数是文件数.
  • 第二个参数是一个文件数组,长度由第一个参数指定.数组的每个元素都是一个C字符串,一个指向以8位字符结尾的空终止数组的指针.

有了这些假设,我会编写如下代码:

function Hello(numFiles: Integer; InFiles: PPAnsiChar): Integer; stdcall;
  external 'dll2.dll';
Run Code Online (Sandbox Code Playgroud)

该函数将被调用如下:

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
Run Code Online (Sandbox Code Playgroud)

您可能更喜欢根据需要编写最终参数@Files[0].我更喜欢演员,因为即使启用了范围检查,它也允许我传递一个空数组.

请注意,我曾经PAnsiChar与之匹配char*.该PChar类型是Delphi版本的别名PAnsiCharPWideChar取决于Delphi版本.最好是明确的.

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