长时间以来,关于mdi子窗口封装到dll的问题始终没有找到正确的解决方法,网上的帖子也都测试不通过。经过本人一天的调试,终于突破难关,解决了该问题。
示例源码如下:
library PowerManager;
uses
SysUtils,
Classes,DB, Forms,ADODB,Windows, Messages,
//添加你自己想调用的mdi子窗体
UserPower in 'UserPower.pas' {Frm_UserPower},
ModelPowerDetail in 'ModelPowerDetail.pas' {Frm_ModelPowerDetail};
{$R *.res}
var
DLLApp:TApplication;
procedure ShowForm(var AApplication:TApplication;AForm:TForm;connect:TADOConnection);export;StdCall;//export;StdCall; 必须这样写
function GetMDIForm(AChildForm:TForm):Boolean;
var
i:Integer;
begin
Result:=false;
for i:=0 to AForm.MDIChildCount-1 do
begin
if AForm.MDIChildren[i].Name =AChildForm.Name then
begin
Result:=true;
Break;
end;
end;
end;
begin
Application := AApplication; //将主程序的application付给COM工程的application对象
if not GetMDIForm(Frm_UserPower) then //GetMDIForm 是判断窗体是否已经创建
begin
Frm_UserPower := TFrm_UserPower.Create(AForm); //创建子窗体
Frm_UserPower.Pconnection:=@connect;
Frm_UserPower.LoadData;
Frm_UserPower.Show;
end;
end;
procedure DLLUnloadProc(Reason: Integer);register;
begin
if (Reason = DLL_PROCESS_DETACH) or (Reason = DLL_THREAD_DETACH) then
Application := DLLApp; //DLLApp是在DLL工程文件中定义的全局TApplication对象 //用来保存Application对象
end;
exports
ShowForm;
begin
DLLApp:=Application; //保留Application
DLLProc := @DLLUnloadProc; //将重写后的入口函数地址付给DLLProc
end.