如何获取另一个包所需的所有包的列表
How to get a list of all packages required by another package
我的应用程序使用运行时包,我想获得其中之一所需的所有包的列表。
示例:
PackA.bpl 需要 PackB.bpl 和 PackC.bpl.
如何在运行时从 PackA.bpl 获取所需的包? (在本例中,它们将是 PackB.bpl 和 PackC.bpl)
您可以使用 GetPackageInfo
from SysUtils
. Here 是一个使用它来枚举包中编译的单元列表的示例(在您的情况下,在您的回调中检查 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);
我的应用程序使用运行时包,我想获得其中之一所需的所有包的列表。
示例:
PackA.bpl 需要 PackB.bpl 和 PackC.bpl.
如何在运行时从 PackA.bpl 获取所需的包? (在本例中,它们将是 PackB.bpl 和 PackC.bpl)
您可以使用 GetPackageInfo
from SysUtils
. Here 是一个使用它来枚举包中编译的单元列表的示例(在您的情况下,在您的回调中检查 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);