使用一个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类型。但是编译器总报错,怎么
办啊? 请高手指教!

解决方案 »

  1.   

    请楼主注意一下,c和delphi之间写dll的一些原则 吧
    1.c dll输出的的函数,最好加上stdcall这个类型,然后delphi也声明为stdcall,确保函数调用时大压栈的顺序一样,这样函数才能正确调用 2.c参数为char数组,delphi中要对应用PChar,不要用AnsiString这些vcl的类,因为vcl是delphi特有的
      

  2.   

    比如
    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]);
      

  3.   

    谢谢ls,调用约定我已经加了cdecl,与c的那个api保持一致。为了简化问题就没写上去。
    另外,我又试了下把PStrings定义成如下的样子:
    type
      MyString = ^PChar;
      PStrings = ^MyString;并且把words重新定义为MyString类型。但还是不行:(
    另外,我还调试跟踪了一下,返回的二维数组地址(存放在words里)正确(因为可以根据这个地址在内存中查找到返回的字符串),数组大小也正确。
      

  4.   

    function c_func(const text: PChar; var words: ^PChar; var size: integer): integer;
      

  5.   

    忘了说:为了能跟踪调试,我把下面这一行先注释掉了:  Memo1.Lines[i] := String(words[i]);  //这一行编译有错误——“Array type required”