我有一个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]);
但我得到的只是“访问违规”
答案 0 :(得分:5)
从表面上看,根据问题中的信息,你的代码似乎基本上没问题。然而,许多初学者使用interop制作的新手错误是相信函数的签名足以定义界面。它不是。例如,类型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*
匹配。 PChar
类型是PAnsiChar
或PWideChar
的别名,具体取决于Delphi版本。最好是明确的。
当然,我的假设可能是错误的。您应该查阅图书馆的文档来确认它们。