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.
解决方案 »
- Delphi2007出现错误:F1027 Unit not foud:'system.psa' or binary equivalents(.dcu)
- 工作六年了 遇到这样的情况!!!
- 如何使用系统服务的功能,来者有分
- 如何做跨库查询?
- 急!!!,Delphi 7 中没有Delphi 5中的DataSetProvider
- ClassName为TStringGrid的控件,我想用SendMessage(hwnd, WM_GETTEXT,....)得到它内部单元格的值
- 谁做过触摸屏查询系统,帮忙!
- 高分求解...........
- 如何编码实现在Win2000下的重启关机等操作?(送100分以上)
- 怎样把StringGrid中的内容输出到文件中,并保持格式。
- *** 高分求助,关于IndyHttp提交到Web页面 ***
- 关于‘DBGrid中的查找字段’方法的问题?
[Fatal Error] Project1.dpr(25): File not found: 'FastShareMem.dcu'
应该在调用DLL的工程文件中第一个引用 ShareMem在DLL退出的时候应该恢复DLL的APPLICATION