Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何获取另一个包所需的所有包的列表_Delphi_Dependencies_Packages_Delphi 2007 - Fatal编程技术网

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

Delphi 如何获取另一个包所需的所有包的列表,delphi,dependencies,packages,delphi-2007,Delphi,Dependencies,Packages,Delphi 2007,我的应用程序使用运行时包,我希望获得其中一个所需的所有包的列表 示例: PackA.bpl需要PackB.bpl和PackC.bpl 如何在运行时从PackA.bpl获取所需的包?(在本例中,它们是PackB.bpl和PackC.bpl)您可以使用fromSysUtils。是一个使用它枚举包中编译的单元列表的示例(在您的示例中,是对ntrequirepackage的回调检查)。例如: procedure GetRequiredPackageName(const Name: string; Nam

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

示例:

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

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

您可以使用from
SysUtils
。是一个使用它枚举包中编译的单元列表的示例(在您的示例中,是对
ntrequirepackage
的回调检查)。例如:

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;
要按名称获取包的句柄,可以使用:


你为什么会发现自己处于这种情况。在编写软件包时,您知道这些信息。你忘了,还是包裹是从别处寄来的?如果是后者,则应记录其依赖关系。那么动态加载的包呢?@DavidHeffernan:你好!PackA.bpl是一个动态加载的包,用于下载应用程序使用的所有包的更新。运行此操作后,将卸载Package并替换下载的软件包文件。如果已下载另一个PackA.bpl,则会有一个备份系统将最后一个工作PackA.bpl保存在备份文件夹中。目前,PackA正在导入所有内容。另一种解决方案是将PackA所需的所有软件包保存在备份文件夹中,但在这种情况下,我不希望“手动”设置它们,因为它们可以更改,我更希望减少出错的可能性。如我所说,编写包并列出其依赖项时,您就知道这些信息。请仅备份更改的文件。(如果需要,您可以进行更多备份,但为什么要将客户的空间浪费在重复的文件上呢?)如果发现PackA无法工作,请从备份中恢复所有内容。你不能违反那项政策。特别是,如果PackC发生更改,请将其包括在备份中。使每个备份集保持独立:更新1创建备份1,更新2创建备份2。不要将备份1和备份2中的文件混在一起,否则在还原时,您将不知道哪些文件是兼容的。@Hwau调用GetPackageInfo,并在回调检查中检查
ntrequirepackage
。是的,如果可执行文件是bpl,则可以加载它并使用其句柄调用GetPackageInfo。如果它是exe,你可以列举它的导入。是的,有,正如我已经说过的。而且,这是一个完全不同于你最初问的问题。
ListRequiredPackages(GetModuleHandle('PackA.bpl'), Names);