dll封装子窗体代码如下:
library Project1;
uses
ShareMem,
ActiveX,
Forms,
Windows,
Graphics,
Controls,
Messages,
SysUtils,
Classes,
Dialogs,
Unit1 in 'Unit1.pas' {Form1};{$R *.res}
var
DllApp:TApplication;procedure CreateForm1(app:TApplication;parentform: TForm); export;stdcall;
var
Form1: TForm1;
DllProc: Pointer;
begin
CoInitialize(nil);
try
Application:=app; Form1:=Tform1.Create(parentform);
form1.MyParentForm:= parentform;
form1.myparentApplication:=app;
Form1.Show;
finally
CoUninitialize;
end;
end;
procedure ExitDll(Reason:Integer);
begin
if Reason = DLL_PROCESS_DETACH then
begin
Application:=DllApp; end;
end;exports
CreateForm1;begin
DllApp:=Application; DllProc:=@ExitDll;
end.其中Unit1代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls;type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
ADOConnection1: TADOConnection;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
ADOQuery1: TADOQuery;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
MyParentForm: TForm;
MyParentApplication: TApplication;
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from c_user where name like ''%'+edit1.Text+'%''');
ADOQuery1.Open;
end;end.
主窗体代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ToolWin, ComCtrls, Menus;type
TForm1 = class(TForm)
Button1: TButton; procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
T_CreateForm1 = procedure (app: TApplication;parentform: TForm);stdcall;
var
Form1: TForm1;implementation
uses
ShareMem;
{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
dllHandle: THandle;
Procaddr: FarProc;
CreateForm1: T_CreateForm1;begin
dllHandle:=LoadLibrary('project1');
Procaddr:=GetProcAddress(dllHandle,'CreateForm1');
if Procaddr <> nil then
begin
CreateForm1:=procaddr;
CreateForm1(Application,self);
end;
end;end.
library Project1;
uses
ShareMem,
ActiveX,
Forms,
Windows,
Graphics,
Controls,
Messages,
SysUtils,
Classes,
Dialogs,
Unit1 in 'Unit1.pas' {Form1};{$R *.res}
var
DllApp:TApplication;procedure CreateForm1(app:TApplication;parentform: TForm); export;stdcall;
var
Form1: TForm1;
DllProc: Pointer;
begin
CoInitialize(nil);
try
Application:=app; Form1:=Tform1.Create(parentform);
form1.MyParentForm:= parentform;
form1.myparentApplication:=app;
Form1.Show;
finally
CoUninitialize;
end;
end;
procedure ExitDll(Reason:Integer);
begin
if Reason = DLL_PROCESS_DETACH then
begin
Application:=DllApp; end;
end;exports
CreateForm1;begin
DllApp:=Application; DllProc:=@ExitDll;
end.其中Unit1代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls;type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
ADOConnection1: TADOConnection;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
ADOQuery1: TADOQuery;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
MyParentForm: TForm;
MyParentApplication: TApplication;
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from c_user where name like ''%'+edit1.Text+'%''');
ADOQuery1.Open;
end;end.
主窗体代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ToolWin, ComCtrls, Menus;type
TForm1 = class(TForm)
Button1: TButton; procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
T_CreateForm1 = procedure (app: TApplication;parentform: TForm);stdcall;
var
Form1: TForm1;implementation
uses
ShareMem;
{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
dllHandle: THandle;
Procaddr: FarProc;
CreateForm1: T_CreateForm1;begin
dllHandle:=LoadLibrary('project1');
Procaddr:=GetProcAddress(dllHandle,'CreateForm1');
if Procaddr <> nil then
begin
CreateForm1:=procaddr;
CreateForm1(Application,self);
end;
end;end.
[Fatal Error] Project1.dpr(25): File not found: 'FastShareMem.dcu'
应该在调用DLL的工程文件中第一个引用 ShareMem在DLL退出的时候应该恢复DLL的APPLICATION