【600分】调用 DLL 中 MDI 窗口,该 DLL 应该如何释放?(300分)

  • 主题发起人 主题发起人 Yhhe
  • 开始时间 开始时间
Y

Yhhe

Unregistered / Unconfirmed
GUEST, unregistred user!
由于调用的是非模式窗体,所以,不可以用在
Show;后面接
FreeLibrary()函数释放DLL的资源。
请问怎样才能在不关闭主程序的情况下释放该DLL资源?

还有300分在这里
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2579682
 
mdi本来就是dll里的,难道你能用着mdi,并且释放dll么?
 
定义一个全局变量:DllHandle 把Dll的句柄记录下来,程序退出的时候再FreeLibrary(DllHandle)
 
楼主说的释放应该是在MDI窗体关闭后在主程序里用
FreeLibrary(DLLHandle);
DLLHandle是一开始调用DLL句柄
 
用面向对象的方法来解决吧。
起先你要建立几个管理对象,如:模块对象、模块管理对象、Form管理对象,等等。
举个例子:
起先,你要建一个Form,那么你先去模块对象去找是否有了那个块模,
即是否已经加载了那个DLL,如果没有,则创建一个模块对象,把信息保存到模块对象中,
然后创建一个Form,并把它加入到Form管理对象中。
现在是关闭创建的Form,那么就通知Form管理对象,要Form管理对象把自己的信息删除。
然后主程序可以起一个线程或定时器,调用模块管理器,判断所有已加载的模块,在Form管理对象
中是否有自己的Form,如果没有,则把该模块释放掉,并把该模块从模块管理对象中删除。
 
dll本身有计数,是可以自动释放的,只要你关闭了最后一次调用,dll就自动释放了
 
谁调用谁释放
 
function KillDll(aDllName: string): Boolean; //释放模块
var
hDLL: THandle;
aName: array[0..256] of char;
FoundDLL: Boolean;
begin
StrPCopy(aName, aDllName);
FoundDLL := False;
repeat
hDLL := GetModuleHandle(aName);
if hDLL = 0 then
Break;
FoundDLL := True;
FreeLibrary(hDLL);
until False;
if FoundDLL then
MessageDlg('成功释放模块!', mtInformation, [mbOK], 0)
else
MessageDlg('DLL找不到!', mtInformation, [mbOK], 0);
end;
 
to danng: Form管理对象怎么建立,怎么知道Form已经关闭
to Siva: dll里只有一个MDI form,我已经把这个 form关了,但是资源无法释放
to abigfish: 主程序怎么支付MDI窗体关闭了?
to zhaokaien,xfast,wjh_wy: 关键是在什么时候 FreeLibrary,我不是不知道有 FreeLibrary
 
MID form自己知到是自己被关闭了,这个没错吧。
根据这个,你可以用回调函数通知主程序做它应该做的事!
 
to qqjm: 具体应该怎么操作?
 
子窗体关闭时发消息给主窗体,主窗体freelibrary
 
to liuying1129: 怎么发消息?能把代码写出来吗?
 
dll发送消息:
postmessage(Ahandle,wm_user+1,0,0);
//Ahandle是主窗体的handle传进来的

主窗体处理消息:
//重载windproc过程
procedure windproc(msg:Tmessage);override;
begin
if msg.msg=wm_user+1 then
begin
freelibrary(hlib);
end;
inherted;
end;
 
我在主窗体加入以下语句

private
procedure windproc(var msg: Tmessage); Message WM_USER+1;

procedure TMainForm.windproc(var msg: Tmessage);
begin
if msg.msg=wm_user+1 then
begin
freelibrary(testh); //testh 为dll handle
end;
inherited;
end;

然后在dll 中的 mdi form 的 formclose事件里加上
postmessage(Ahandle,wm_user+1,0,0);

但是 TMainForm.windproc 并没有执行,不知道为什么

btw, to liuying1129: override 应该写哪里?怎么写,我写的通过不了
 
我在主窗体加入以下语句

public
procedure WndProc (var Msg: TMessage);override;

procedure TMainForm.WndProc(var msg: Tmessage);
begin
case Msg.Msg of
WM_USER + 1:
FreeLIBRARY(testh);
end;
inherited;
end;

然后在dll 中的 mdi form 的 FormDestroy事件里加上
PostMessage(AHandle,WM_USER+1,0,0);//发送消息让调用程序释放DLL


不好意思,写错了,应该是WndProc
 
to liuying1129: 还是无法释放,我跟踪了,handle 都是传的正确的,但是关闭
mdi form 时没有激活事件
procedure TMainForm.WndProc(var msg: Tmessage);
begin
case Msg.Msg of
WM_USER + 1:
FreeLIBRARY(testh);
end;
inherited;
end;

我用的 delphi7+sp1
 
我在主form上加了个按钮直接执行
PostMessage(Application.Handle,WM_USER+1,0,0);
也没触发事件procedure TMainForm.WndProc(var msg: Tmessage);
 
搞定了,应该传 Handle,而不是Application.Handle

谢谢大家,散分

liuying1129 请到 http://www.delphibbs.com/delphibbs/dispq.asp?lid=2579682 再领分
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部