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

时间:2015-10-10 10:36:40

标签: delphi dll

我有一个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]);

但我得到的只是“访问违规”

1 个答案:

答案 0 :(得分:5)

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

鉴于

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

让我们假设以下内容:

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

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

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*匹配。 PChar类型是PAnsiCharPWideChar的别名,具体取决于Delphi版本。最好是明确的。

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