我在向自己编写的Dll中传在一个DataSet在动态调用时缺包错 下面是带码procedure ShowMe(Ahand:Thandle;ADataSet:DataSet);
var
  Aform: Tform1;
begin
  application.handle:=Ahand;
  AForm:= TForm1.create(Application);
  try
    AForm.datasource.dataset:=ADataset;
    AForm.showmodule;
  finally
    Aform.free;
  end;
end;
请问是那里的错??

解决方案 »

  1.   

    http://expert.csdn.net/Expert/topic/1239/1239419.xml?temp=.6726343
    你可以参考一下
      

  2.   

    给你一个例子:主程序和dll之间的参数传递:主程序代码:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure pro_click(sender:TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      jk_handle:Thandle;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    begin
      pro_click(self);
    end;procedure TForm1.pro_click(Sender: TObject);
    var
     ls_menu:string;
     jk:procedure (cs_gzbh,cs_xm,cs_bmfs:string);stdcall;
        // 传递参数:工作编号,姓名,编码方式
    begin    jk_handle:=loadlibrary(pchar('new'));
        if jk_handle<=0 then // 不存在DLL
        begin
          Application.messagebox('动态链接库加载失败!','提示',64);
          exit;
        end
        else // 存在DLL
        begin
          try
            @jk:=GetprocAddress(jk_handle,'jk_cscd');
            jk('1','2','3');
          except
            Application.messagebox('动态链接库加载失败!','提示',64);
            exit;
          end; // end of except
        end;
    end;end.//////////////////////////////////////////////调用的new.dll的代码:
    library new;uses
      Forms,
      Unit1 in 'Unit1.pas' {Form1};{$R *.RES}
    exports
      jk_cscd;//传入gzbh,接口过程begin
      {Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;}
    end.
    _______________________________________unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Label1: TLabel;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      procedure jk_create;// 建立表单
      procedure jk_free;  // 释放表单
      procedure jk_cscd(cs_gzbh:string;cs_xm:string;cs_bmfs:string);stdcall;implementation{$R *.DFM}
    procedure jk_create;//建立表单
    begin
      Application.CreateForm(Tform1, form1);
    end;procedure  jk_free;//释放表单
    begin
      if assigned(form1) then form1.Free;
    end;procedure jk_cscd(cs_gzbh,cs_xm,cs_bmfs:string);stdcall;
    begin
     try
      jk_create;
      form1.Label1.Caption:=cs_gzbh+','+cs_xm+','+cs_bmfs;
      form1.ShowModal;
      finally
      jk_free;
      end;
    end;
    end.
      

  3.   

    可以传递VCL变量吗?
    你可以把DataSet输出成XML,然后以String形式把它传递,最后在接受方合成DataSet
      

  4.   

    zzzl(早安的空气)可以传递VCL变量吗?
    你可以把DataSet输出成XML,然后以String形式把它传递,最后在接受方合成DataSet不会,请弄个例子吧 谢谢了
      

  5.   

    在dll中无法获得返回值
    请看 之是dll内的代码
    Function ShowMe(Ahand:Thandle):String;
    Var
      AForm: Tform2;
    Begin
      Application.Handle:=Ahand;
      Aform:=Tform2.Create(application);
      Try
        AForm.ShowModal;
        Result:=form2.PStr;
      Finally
        AForm.Free;
      end;
    end;这是调用的代码
    procedure TForm1.Button1Click(Sender: TObject);
    Var
      Ahand: Thandle;
      AFun: Function(Ahand:Thandle):string;
    begin
      Ahand:= loadlibrary(pchar('F:\HST\temp\Temp\Find.dll'));
      If Ahand<=0 then
        showmessage('erro1')
      else begin
        @Afun:=GetProcAddress(Ahand,pchar('ShowMe'));
        If not(@AFun=nil) then
          Showmessage(Afun(Handle))
        else
          showmessage('error2');
        Freelibrary(Ahand);
      end;
    end;包错
    真的不行吗