如何获取另一个包所需的所有包的列表

时间:2015-05-12 12:48:09

标签: delphi dependencies packages delphi-2007

我的应用程序使用运行时包,我想获得其中一个所需的所有包的列表。

示例:

PackA.bpl需要PackB.bpl和PackC.bpl。

如何在运行时从PackA.bpl获取所需的包? (在这个例子中,它们将是PackB.bpl和PackC.bpl)

1 个答案:

答案 0 :(得分:3)

您可以使用SysUtils中的GetPackageInfoHere是一个使用它来枚举包中编译的单元列表的示例(在您的情况下,在ntRequiresPackage的回调检查中)。例如:

procedure GetRequiredPackageName(const Name: string; NameType: TNameType; Flags: Byte; Param: Pointer);
var
  Names: TStrings absolute Param;
begin
  case NameType of
    ntRequiresPackage:
      Names.Add(Name);
  end;
end;

procedure GetRequiredPackageNames(Module: HMODULE; Names: TStrings);
var
  Flags: Integer;
begin
  Names.BeginUpdate;
  try
    GetPackageInfo(Module, Names, Flags, GetRequiredPackageName);
  finally
    Names.EndUpdate;
  end;
end;

function ListRequiredPackages(HInstance: NativeInt; Data: Pointer): Boolean;
var
  Names: TStrings absolute Data;
  I: Integer;
begin
  Result := True;
  Names.Clear;
  GetRequiredPackageNames(HInstance, Data);
  Writeln(Format('%s requires: %d packages', [ExtractFileName(GetModuleName(HInstance)), Names.Count]));
  if Names.Count > 0 then
    for I := 0 to Names.Count - 1 do
      Writeln(Names[I]);
end;

procedure Main;
var
  Names: TStringList;
  I: Integer;
begin
  Names := TStringList.Create;
  try
    EnumModules(ListRequiredPackages, Names);
    Readln;
  finally
    Names.Free;
  end;
end;

要按名称获取包的句柄,可以使用GetModuleHandle

ListRequiredPackages(GetModuleHandle('PackA.bpl'), Names);