使用一个c写的dll,其中一个导出函数原型如下:int c_func(const char * text, char *** words, int * size);该函数接受一个字符串text, 输出一个2维数组(即:一个c字符串的数组)和该数组的第一维大小(即:字符串的数目)。该数组所占空间由被调函数分配。为了在delphi中使用这个函数,我在delphi中声明了该函数的原型如下:
type
PStrings = ^PAnsiString;function c_func(const text: PChar; words: PStrings; size: PInteger): integer;以上声明在delphi中可以通过编译,下面是使用:
var
words: PAnsiString;
i, size: integer;
//...
Text2Words(PChar(Edit1.Text), @words, @size);
for i := 0 to size do
begin
Memo1.Lines[i] := String(words[i]); //这一行编译有错误——“Array type required”
end;words是一个二维数组的首地址,words[i]应该即一个AnsiString类型。但是编译器总报错,怎么
办啊? 请高手指教!
type
PStrings = ^PAnsiString;function c_func(const text: PChar; words: PStrings; size: PInteger): integer;以上声明在delphi中可以通过编译,下面是使用:
var
words: PAnsiString;
i, size: integer;
//...
Text2Words(PChar(Edit1.Text), @words, @size);
for i := 0 to size do
begin
Memo1.Lines[i] := String(words[i]); //这一行编译有错误——“Array type required”
end;words是一个二维数组的首地址,words[i]应该即一个AnsiString类型。但是编译器总报错,怎么
办啊? 请高手指教!
1.c dll输出的的函数,最好加上stdcall这个类型,然后delphi也声明为stdcall,确保函数调用时大压栈的顺序一样,这样函数才能正确调用 2.c参数为char数组,delphi中要对应用PChar,不要用AnsiString这些vcl的类,因为vcl是delphi特有的
int stdcall c_func(const char * text, char **words, int * size);function c_func(const text: PChar; words: ^PChar; size: PInteger): integer;stdcall
试试这样有错吗?
Memo1.Lines[i] := String(words[i]);
另外,我又试了下把PStrings定义成如下的样子:
type
MyString = ^PChar;
PStrings = ^MyString;并且把words重新定义为MyString类型。但还是不行:(
另外,我还调试跟踪了一下,返回的二维数组地址(存放在words里)正确(因为可以根据这个地址在内存中查找到返回的字符串),数组大小也正确。