双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

MDI动态调用DLL子窗体,异常,静态调用则无任何问题 ,求解

billy_16888 billy_16888 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
DLL.dpr
--------------------------------------------------------------
Procedure LoadChild(ParentApp: TApplication;ParentForm:TForm);export; stdcall;
begin
Application:=ParentApp;
Form1:=TForm1.Create(ParentForm);
Form1.Show;
end;

procedure DLLUnloadProc(Reason: Integer); register;
begin
if Reason = DLL_PROCESS_DETACH then
if Assigned(DllApplication) then
Application:=DllApplication;
end;

exports
LoadChild;
begin
DllApplication:=Application;
DLLProc := @DLLUnloadProc;
end.

dll pas文件
-------------------------------------------
var
Form1: TForm1;
DllApplication:TApplication;
implementation

{$R *.dfm}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=CaFree;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Form1:=nil;
end;


主程序调用:
--------------------------------------------------

T_ProvaChild=procedure(ParentApp:TApplication;ParentForm:TForm);stdcall;
//动态调用使用
var
MainFrm: TMainFrm;
procedure LoadChild(ParentApp:TApplication;ParentForm:TForm);stdcall;external 'DLL.dll';
//静态调用方法
implementation

{$R *.dfm}

uses About_C;

procedure TMainFrm.N14Click(Sender: TObject);
begin
//静态调用方法
LoadChild(Application,Self);
end;

procedure TMainFrm.N15Click(Sender: TObject);
var
DllHandle:THandle;
ProvaChild:T_ProvaChild;
begin
DllHandle := LoadLibrary('DLL.dll');
try
if DLLHandle <> 0 then
begin
@ProvaChild:= GetProcAddress(DLLHandle,'LoadChild');
//获取DLL方法地址
if Assigned(@ProvaChild) then
begin
ProvaChild(Application,Self);
end;
end;
finally
if DLLHandle<>0 then
FreeLibrary(DLLHandle);
//释放DLL
end;
end;

----------------------------------------------

1、如果依静态调用的话,完全正常,
2、采用动态调用的话,则感觉Application丢失了,调出来的窗体动不了。


...全文

相关推荐

评论 3
收藏 已收藏
分享
返回顶部
billy_16888
数据库相关 2,508 成员 88,437 内容