MDI动态调用DLL子窗体,异常,静态调用则无任何问题 ,求解
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丢失了,调出来的窗体动不了。
--------------------------------------------------------------
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丢失了,调出来的窗体动不了。
...全文
相关推荐
让VB可以调用DLL控件中的窗体为MDI子窗体
让VB可以调用DLL控件中的窗体为MDI子窗体
C# WinForms多文档界面MDI框架完整源码与避坑指南
多文档界面(MDI)是桌面应用开发中常见的窗体组织模式,尤其在C# WinForms领域,它不仅是打开多个子窗口那么简单,更涉及焦点管理、菜单联动、内存释放与数据路由等复杂工程问题。对于正在构建上位机、进销存或后台管理系统的开发者而言,理解MDI的底层原理与实现路线,能有效避免窗口一多便出现界面卡死、菜单错乱等典型故障。本文从框架分层设计出发,详解主窗体配置、子窗体基类封装、MdiManager消息总线,以及事件通讯中的委托与广播机制,并针对激活时机、闪烁问题、DPI适配等高频痛点给出可直接落地的C#源码级
Delph插件窗体Dll和mdi,实现Tabcontrol多页面管理
Delphi实现mdi窗体封装到dll中并实现插件管理,动态加载,采用tabcontrol多页面管理
DLL中MDI子窗体的调用
此压缩文件中的程序,演示了在DLL中如何调用MDI子窗体.对于包含MDI子窗体的DLL,可调用DLL中的子窗体.
添加DLL中的MDI子窗体
这是从ccrun的手里得来的,调用DLL中MDI子窗体的实例


数据库相关

