我有一个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)
但我得到的只是"访问违规"
从表面上看,根据问题中的信息,你的代码似乎基本上没问题.然而,许多初学者使用interop制作的新手错误是相信函数的签名足以定义界面.它不是.例如,类型的参数char**可以用于许多不同的事情.因此,要指定信息,还必须指定参数的语义,而不仅仅是语法.
特定
int __stdcall Hello(int numFiles, char **inFiles)
Run Code Online (Sandbox Code Playgroud)
让我们假设以下内容:
0表示成功.有了这些假设,我会编写如下代码:
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版本的别名PAnsiChar或PWideChar取决于Delphi版本.最好是明确的.
当然,我的假设可能是错误的.您应该查阅图书馆的文档来确认它们.
| 归档时间: |
|
| 查看次数: |
1085 次 |
| 最近记录: |