Delphi 检查BPL包的加载频率
我正在从不同的BPL包加载表单,如下所述: 然而,我没有向他们展示模态 因此,同一个包(和表单)可能会被加载两次——有时这是必要的 当我现在调用Delphi 检查BPL包的加载频率,delphi,delphi-10-seattle,Delphi,Delphi 10 Seattle,我正在从不同的BPL包加载表单,如下所述: 然而,我没有向他们展示模态 因此,同一个包(和表单)可能会被加载两次——有时这是必要的 当我现在调用DoUnloadPackage时,不仅会卸载一个表单(因此关闭),还会从这个包中卸载所有加载的表单 所以我的问题是,是否有一种方法可以检查特定包的加载频率 目前,我正在列表中保存包句柄 每当一个包被加载时,我就添加它的包句柄 每当一个包被卸载时,我就移除它的包句柄 当一个包只有一个句柄时,我完全卸载它 基本上我修改了DoUnloadPackage如
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].免费;
结束;
取消注册模块类(模块);
结束;
//总是接到电话
卸载包装(模块);
结束;
所以可能有一个内部计数器或函数来确定一个包被加载的频率?谢谢。一个包裹不能装载两次。由于你正在加载表单,你可以简单地计数。一个包不能加载两次。既然你正在加载表单,你可以简单地计数。