新手请教在dll封装了MDI子窗体,想从主窗体传递变量到dll的子窗体.
W9757 2009-10-30 02:55:04 这个例子是我从网上找的.方法是正确的.但现在有需要从主程序中传递DL_XM,DL_QX变量(string)到dll的子窗体中.源程序如下,请指教.........
DLL单元:
library MDIChild1;
uses
Windows,
Classes,
Controls,
Forms,
UnitMDIChildForm1 in 'UnitMDIChildForm1.pas' {MDIChildForm1};
{$R *.res}
function LoadForm(ParentApplication: TApplication; ParentForm: TForm): THandle; export; stdcall;
var
Form1: TMDIChildForm1;
DllProc: Pointer;
begin
Application:=ParentApplication;
Form1 := TMDIChildForm1.Create(ParentForm);
Form1.MyParentForm:=ParentForm;
Form1.MyParentApplication:=ParentApplication;
Form1.Show;
end;
procedure DLLUnloadProc(Reason: Integer); register;
begin
if Reason = DLL_PROCESS_DETACH then
Application:=DllApplication;
end;
exports
LoadForm;
begin
DllApplication := Application;
DLLProc := @DLLUnloadProc;
end.
DLL中mdichildform1单元:
unit UnitMDIChildForm1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TMDIChildForm1 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
MyParentForm: TForm;
MyParentApplication: TApplication;
end;
var
MDIChildForm1: TMDIChildForm1;
DllApplication: TApplication;
implementation
{$R *.dfm}
procedure TMDIChildForm1.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action:=caFree;
end;
end.
主调程序单元:
unit UnitMainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus;
type
TLoadForm = function(ParentApplication: TApplication; ParentForm: TForm): THandle; stdcall;
TMainForm = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
procedure N1Click(Sender: TObject);
private
{ Private declarations }
DLLModule: HModule;
LoadForm: TLoadForm;
procedure DLLLoad;
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.DLLLoad;
begin
DLLModule := LoadLibrary('MDIChild1.dll');
if DLLModule <> 0 then
try
@LoadForm := GetProcAddress(DLLModule, 'LoadForm');
except
ShowMessage ('Package not found');
end;
end;
procedure TMainForm.N1Click(Sender: TObject);
var
DllHandle: THandle;
ProcAddr: FarProc;
LoadForm: TLoadForm;
begin
DllHandle := LoadLibrary('MDIChild1');
ProcAddr := GetProcAddress(DllHandle, 'LoadForm');
if ProcAddr <> nil then
begin
LoadForm := ProcAddr;
LoadForm(Application,Self);
end;
end;
end.