首页 > 解决方案 > 如何从目标 BPL 中检测 UnloadPackage?

问题描述

是否有部分代码在卸载动态包调用UnloadPackage函数时执行?

var
  MyPackageHandle : THandle;
begin
  MyPackageHandle := LoadPackage('.\MyPackage.bpl');
  if(MyPackageHandle <> 0) then 
    UnloadPackage(MyPackageHandle);
end;

在这种情况下,我需要在MyPackage.bpl卸载时执行一些代码

标签: delphipackagedelphi-2007

解决方案


finalization一般规则是您应该将在您的包卸载到您的单元部分时需要调用的代码。我从您的其他软件包中知道您正在尝试卸载 dll。但问题是永远不应该从initializationor加载/卸载 dll finalization

所以你需要做的是在你的包中有一个函数,你将从你的主应用程序中调用它来执行清理。

type
  TCleanup = procedure;
var
  MyPackageHandle : THandle;
  CleanupProc: TCleanup;
begin
  MyPackageHandle := LoadPackage('.\MyPackage.bpl');
  if(MyPackageHandle <> 0) then
  begin
    @CleanupProc := GetProcAddress(MyPackageHandle, 'Cleanup' );
    if @CleanupProc <> nil then
      CleanupProc;
    UnloadPackage(MyPackageHandle);
  end;
end;

推荐阅读