我看了很多介绍delphi开发dll的示例,但没有看到如题所说的内容,盼能释疑!
我的想法就是将一个应用程序exe完全转变成dll文件(有多个窗体)
现行谢过!有正确答案给分

解决方案 »

  1.   

    可以记得把tapplication和tscreen传进去
      

  2.   

    h呵呵 这样的例子多的很 你可以把一个应用程序都改成dll文件 根据需要而定
      

  3.   

    type
      T_createdllform = function(app:Tapplication;scr:Tscreen;mainhandle:Thandle;
        sadoconn:Tadoconnection;pstr:pchar;scds:Tclientdataset):Tform;//接口函数说明
    //调用dll
    procedure TForm3.exccreatedllform1Click(Sender: TObject);
    var
      dllproc:T_createdllform;
      str1:string;
      pstr:pchar;
      ret:boolean;
      //dllhandle:Thandle;
    begin
      ret:=OpenForm(dllform);
      if ret then exit;
      str1:='123456';
      pstr:=pchar(str1);
      dllhandle:=loadlibrary('projectdll');//加载dll
      if dllhandle<>0 then
      begin
        @dllproc:=getprocaddress(dllhandle,'createdllform');
        if assigned(dllproc) then
        begin
          dllform:=dllproc(application,screen,form3.Handle,adoconnection1,pstr,clientdataset1);//传参数,返回Tform 类型
        end;
      end;end;
    //dll工程部分
    {$R *.res}
    var
      Dllapp:Tapplication;
      Dllscr:Tscreen;
    function createdllform(app:Tapplication;scr:Tscreen;mainhandle:Thandle;sadoconn:Tadoconnection;mNO:pchar;
      scds:Tclientdataset):Tform;
    begin
      OleInitialize(Nil);
      application:=app;
      screen:=scr;
      mainTH:=mainhandle;
      Application.CreateForm(Tform2, form2);
      Gadoconn:=sadoconn;
      ICDS:=scds;
      form2.ClientDataSet2.Data:=ICDS.Data;
      form2.button1.caption:=string(mNO);
      IniDBgrid(form2.dbgrideh1,form2.clientdataset2,'bill_stock_main');
      result:=form2;
      OleUnInitialize;
    end;procedure exitdll(reason:integer);
    begin
      if reason=DLL_PROCESS_DETACH then
      begin
        application:=Dllapp;
        screen:=Dllscr;
      end;
    end;exports
      createdllform;begin
      Dllapp:=application;
      Dllscr:=screen;
      Dllproc:=@exitdll;
    end.