Delphi 检查BPL包的加载频率

Delphi 检查BPL包的加载频率,delphi,delphi-10-seattle,Delphi,Delphi 10 Seattle,我正在从不同的BPL包加载表单,如下所述: 然而,我没有向他们展示模态 因此,同一个包(和表单)可能会被加载两次——有时这是必要的 当我现在调用DoUnloadPackage时,不仅会卸载一个表单(因此关闭),还会从这个包中卸载所有加载的表单 所以我的问题是,是否有一种方法可以检查特定包的加载频率 目前,我正在列表中保存包句柄 每当一个包被加载时,我就添加它的包句柄 每当一个包被卸载时,我就移除它的包句柄 当一个包只有一个句柄时,我完全卸载它 基本上我修改了DoUnloadPackage如

我正在从不同的BPL包加载表单,如下所述:

然而,我没有向他们展示模态

因此,同一个包(和表单)可能会被加载两次——有时这是必要的

当我现在调用
DoUnloadPackage
时,不仅会卸载一个表单(因此关闭),还会从这个包中卸载所有加载的表单

所以我的问题是,是否有一种方法可以检查特定包的加载频率

目前,我正在列表中保存包句柄

  • 每当一个包被加载时,我就添加它的包句柄
  • 每当一个包被卸载时,我就移除它的包句柄
当一个包只有一个句柄时,我完全卸载它

基本上我修改了
DoUnloadPackage
如下:

var loadedmodules: TList<HModule>;

procedure DoUnloadPackage(Module: HModule);
var
  i: Integer;
  M: TMemoryBasicInformation;
begin
  // remove the modules handle from the list 
  loadedmodules.Delete(loadedmodules.IndexOf(Module));

  // maybe there are still more forms loaded from the same package?
  if loadedmodules.IndexOf(Module) <> -1 then
  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[i].ClassName), M, SizeOf(M));

      if (Module = 0) or (HMODULE(M.AllocationBase) = Module) then
        Application.Components[i].Free;
    end;
    UnRegisterModuleClasses(Module);
  end;

  // gets always called
  UnLoadPackage(Module);
end;
var加载模块:TList;
程序包(模块:HModule);
变量
i:整数;
M:t记忆基础信息;
开始
//从列表中删除模块句柄
loadedmodules.Delete(loadedmodules.IndexOf(Module));
//也许还有更多的表单从同一个包中加载?
如果加载了modules.IndexOf(Module)-1,则
开始
{确保没有任何
来自实例化模块的类的,如果
然后释放它们。(假设
类由应用程序拥有)}
对于i:=Application.ComponentCount-1到0
开始
VirtualQuery(GetClass(Application.Components[i].ClassName)、M、SizeOf(M));
如果(Module=0)或(HMODULE(M.AllocationBase)=Module),则
Application.Components[i].免费;
结束;
取消注册模块类(模块);
结束;
//总是接到电话
卸载包装(模块);
结束;

所以可能有一个内部计数器或函数来确定一个包被加载的频率?谢谢。

一个包裹不能装载两次。由于你正在加载表单,你可以简单地计数。一个包不能加载两次。既然你正在加载表单,你可以简单地计数。