简单问题,怎样释放带有窗体的DLL(200分)

  • 主题发起人 主题发起人 heiniu
  • 开始时间 开始时间
H

heiniu

Unregistered / Unconfirmed
GUEST, unregistred user!
我在程序中用nDllHandle := LoadLibrary(DLLName)调用了带有窗体的DLL文件,
在delphi5中释放时用FreeLibrary(nDllHandle)释放正常,但在DELPHI6中就会出
错,请问该如何解决。
 
什么错误提示?
 
出现的情况是:主程序停顿在那里,没有了响应。
 
窗体的释放是在dll中还是在主程序?
dll中是否有用到数据库连接?
 
to zm30:窗体在dll中释放,dll有连接数据库。
 
在窗体的OnClose中将所有Dataset全部关闭,再断开数据库连接,
如果光断开数据库连接可能会有错
 
安全的做法是在dll unload时将窗口释放。
如:

procedure myExit ;
begin
....
frm.Free ;
g_pOldExit ;
....
end ;
var
g_pOldExit : Pointer ;
begin
...
g_pOldExit := @ExitProc;
ExitProc := @myExit ;
.....
end ;

或者,在dll中输出特定的释放函数。
 
to jackliew:
试过你的方法,还是不行,这是不是delphi6的问题啊
 
出现错误提示框:
project c:/aa.exe raised too many consecutive exceptions:
'access violation at 0x036636ae: read of address 0x0373eaec'.
Process Stopped.Use Step or Run to continue
 
我也碰到这个问题了,老贴,继续回答啊:)
 
不用关闭dataset。先单步调试,找到出现问题的那句程序,再分析。我都习以为常了。出问题,解决问题(“这种现象太普遍了”和你的问题一样)。

关键一条: 窗体上,由窗体一同创建的东西,都会自动释放。手动创建的东西,就要在FreeLibrary(nDllHandle)前(后),自己用代码释放!
FreeLibrary(nDllHandle)一般写在窗体的destroy事件中。
错误归根结底,只有一种:非法访问不存在的对象引起的!
 
后退
顶部