先设计两个窗体:DllForm(当非模式窗体)、DllModalForm(当模式窗体)
制作一个Dll文件: library FormDll;
uses SysUtils, Classes, Forms, Windows, Controls, DllForm in 'DllForm.pas' {Form1}, //当非模式窗口 DllModalForm in 'DllModalForm.pas' {Form2}; //当模式窗口
{$R *.res} var DllApp:TApplication; DllScreen:TScreen; //非模式窗口 procedure ShowDllForm(aHandle:THandle;aCaption:Pchar);stdcall; var aForm:TForm1; begin Application.Handle:=aHandle; aForm:=TForm1.Create(Application); aForm.Edit1.Text:=aCaption; aForm.Show; end; //模式窗口 //procedure ShowDllModalForm(aApp:TApplication;aCaption:PChar);stdcall; //参数传递的是Application.Handle句柄;而不是Application对象 procedure ShowDllModalForm(aHandle:THandle;aCaption:PChar);stdcall; var aForm:TForm2; begin Application.Handle:=aHandle; aForm:=TForm2.Create(Application); try aForm.Edit1.Text:=aCaption; aForm.ShowModal; finally SysUtils.FreeAndNil(aForm); end; end; procedure DllUnLoadProc(dwReason:DWord); begin if dwReason=Dll_Process_Detach then begin Application:=DllApp; //恢复 Screen:=DllScreen; end; end; Exports ShowDllForm,ShowDllModalForm; //区分大小写 begin //Dll初始化区 DllApp:=Application; DllScreen:=Screen; DllProc:=@DllUnLoadProc; //Dll的善后处理工作 DllUnLoadProc(Dll_Process_Detach); end. 在EXE文件中调用: 非模式窗体的调用: {$R *.dfm} var DllHandle:THandle; procedure TForm8.Button1Click(Sender: TObject); type TShowDllForm=procedure(aHandle:THandle;aCaption:Pchar);stdcall; var DllForm:TShowDllForm; begin @DllForm:=Windows.GetProcAddress(DllHandle,'ShowDllForm'); if @DllForm<>nil then DllForm(Self.Handle,PChar(Edit1.Text)); end;
procedure TForm8.FormCreate(Sender: TObject); begin DllHandle:=Windows.LoadLibrary('f:\temp\FormDll.dll'); if DllHandle<32 then begin Application.MessageBox(PChar('Unable to Load Dll.'),'警告',0); end; end;
procedure TForm8.FormDestroy(Sender: TObject); begin Windows.FreeLibrary(DllHandle); end;
模式窗体的调用: procedure TForm8.Button2Click(Sender: TObject); type TDllModalForm=procedure(aHandle:THandle;aCaption:PChar);stdcall; var DllModalForm:TDllModalForm; h:THandle; begin h:=Windows.LoadLibrary('f:\temp\FormDll.dll'); try if h>32 then begin @DllModalForm:=Windows.GetProcAddress(h,'ShowDllModalForm'); if @DllModalForm<>nil then DllModalForm(Application.Handle,PChar(Edit1.Text)); end; finally Windows.FreeLibrary(h); end; end;
总结:关键是将EXE的系统句柄传递给DLL文件中的窗体文件,让DLL中的Application对象与EXE中的Application对象能够协调一致。 |
|