dll 中存在一个窗体 窗体的public段中有如下字段 parray:array[0..119] of char; 
picindex:Integer;
picname:string;
通过窗体上的按钮对以上三个成员进行赋值
然后通过导出函数将窗体中的三个成员的值传出到宿主程序中,导出函数如下定义
function exprt(parray:pchar;var picindex:Integer;picname:string):Integer;stdcall;
begin
    if Fm_main=nil then
    begin
      fm_main:=TFm_main.Create(Fm_main);
    end;
    Fm_main.picname:=Trim(picname);
    try
      Fm_main.ShowModal;
    finally
      parray:=Fm_main.parray;
      picindex:=Fm_main.g_picindex;
      Fm_main.Free;
      fm_main:=nil;
    end;
end;
宿主程序中用的动态调用
function Enroll(parray:pchar;var picindex:Integer;picname:string):Integer;
var
    myhandle,myhandle1,myhandle2:Thandle;
    myfunc:function (parray:pchar;var picindex:Integer;picname:string):integer;StdCall;
begin
  result:=-1;
  myhandle1:=loadlibrary('1.dll');               
  myhandle2:=loadlibrary('2.dll');
  myhandle:=loadlibrary('3.dll');
  if (myhandle<=0) then
  begin
    application.MessageBox('找不到 3.dll !','警告');
    exit;
  end;
  try
    @myfunc:=getprocaddress(myhandle,'Enroll');    if (@myfunc <> nil) then
    begin
      result:=myfunc(parray,picindex,picname);
    end;
  finally
    freelibrary(myhandle);
    freelibrary(myhandle1);
    freelibrary(myhandle2);
  end;end;调用的时候 
ary:array[0..199] of char;
tmppicindex:integer;
tmppicname:='tmp.bmp';
Enroll(ary,tmppicindex,tmppicname);
最后ary的值无法得到,tmppicindex值可以得到,我试过了在dll中声明 var parray 作为传出参数还是不行,
高手指点!

解决方案 »

  1.   

    另外 parray:array[0..199] of char 和 pchr:pchar
    之间是否可以直接赋值?
      

  2.   


    在dll中建议不要使用string类型改用pchar类型
    >>另外 parray:array[0..199] of char 和 pchr:pchar
    var
      parray:array[0..199] of char;
      pchr:pchar;
    begin
      parray:='fdasfdsafdsa';
      pchr:=parray;
      showmessage( string(pchr[1]) );
    end;
      

  3.   

    那个string类型的没有关系,主要是那个array类型的无法得到传出的值。
      

  4.   

    是不是在宿主端parray 要声明划分内存地址空间?
      

  5.   

    传地址和 size,然后 CopyMemory 出来,不然很危险。