DLL
function test(var b : array of pchar) : pchar;stdcall;
var
  i : integer;
begin
  for i := low(b) to high(b) do
    b[i] := pchar(format('第%d',[i]));
  result := 'test';
end;
EXE:
var
  b : array of pchar;
begin  
  loaddll...
  setlength(b,3);
  test(b);
  for i := low(b) to high(b) do
    memo1.lines.add(strpas(b[i]));
end;输出的时候出现乱码
如果DLL修改成
function test(var b : array of pchar) : pchar;stdcall;
begin
  b[0] := pchar('第0');
  b[1] := pchar('第1');
  b[2] := pchar('第2');
end;
正确。  

解决方案 »

  1.   

    用动态数组的话,除非DLL和主程序都是用同一版本的2007或更高版本的编译器编译,否则记得使用ShareMem.
      

  2.   

    动态的处理比较麻烦。有什么简单的方法吗。
    比如我要把TSTRINGGRID中用户输入的内容作为参数传到DLL中。
    我原来好象用的 array of array of pchar
      

  3.   

    使用ShareMem,然后可以使用array of array of string替换 array of array of pchar
    或者也可以使用array of TStringList,或者也可以单用一个TStringList(单行数据当中各列之间使用分隔符。或者也可以就直接使用String,那样就是各列之间要用特定的分隔符,各行之间也要用特定型的分隔符。例如:[data_0_0]<TAB>[data_0_1]<TAB><CR>[data_1_0]<TAB>[data_1_1]<TAB><CR>
    [data_0_0] [data_0_1]
    [data_1_0] [data_1_1]