请教大虾,怎样unload 动态调入的package?(100分)

  • 主题发起人 主题发起人 wangwh
  • 开始时间 开始时间
W

wangwh

Unregistered / Unconfirmed
GUEST, unregistred user!
;动态调入package, 在用完其中的Form(用Show)后,如何unload该package?
 
不必关心, 系统会自动卸掉的
 
只在关闭程序时才卸掉的说, 如在运行时, 无法卸掉 :-(
 
你可以使用SysUtils单元的UnloadPackage procedure,卸载该包。
procedure UnloadPackage(Module: HMODULE);
其中Module参数是待卸载包的句柄。由LoadPackage传入。
 
我是希望用完就卸掉,这样可以节省资源.
unloadpackage应写到哪个事件里?
我觉得应在主程序里监测package中的Form关闭,然后执行unload,
但不知如何实现.
 
这个Form是不是一定要放在Package中,如果能可能的话可把这个Form放到Dll中,
然后在主程序中动态的载入和释放Dll
 
;因为该form有数据库信息, 如果用dll,则每调用一dll, dll中都要重新登录
数据库, 而用package,只要主程序登录一次就行了. 这样,不但可以提高效率,
还可以减少数据库的连接数
 
卸它干嘛,没事找事
 
1.首先,DLL中放form并不需要多次登录数据库,可以共享一个连接,
这一点论坛上有很多解答了,有很多方法,我也回答过不止一次。

2.动态释放Package比较麻烦,这里是李维的一个例子,应该可以:

procedure UnLoadAddInPackage(Module: THandle);
var
i: Integer;
M: TMemoryBasicInformation;
begin
{ Make sure there aren't any instances of any of the classes from Module
instantiated, if so then free them. (this assumes that the classes are
owned by the application) }
for i := Application.ComponentCount - 1 downto 0 do
begin
VirtualQuery(GetClass(Application.Components.ClassName), M, SizeOf(M));
if (Module = 0) or (HMODULE(M.AllocationBase) = Module) then
begin
ShowMessage(Application.Components.ClassName);
Application.Components.Free;
end;
end;
UnRegisterModuleClasses(Module);
UnLoadPackage(Module);
end;
 
接受答案了.
 
后退
顶部