初始化时获取当前包名称

时间:2016-12-14 11:50:43

标签: delphi initialization package

我的应用程序动态加载提供我需要的对象实现的包。我有一个全局函数来在列表结构上注册对象类,我用它来动态创建实例。

procedure RegisterObjectStd(const APackageName, AObjectName: string; const AClass: TClass);

因此,我可以通过工厂方法

创建一个引用特定上下文的实例

示例:

function CreateObject(const APackageName, AObjectName: string): TObject;

有没有办法在初始化代码中以动态方式检索当前包的名称(.bpl)?

initialization
  RegisterObjectStd(GetCurrentBplName, 'MyObjectName', TMyObjectClass);

1 个答案:

答案 0 :(得分:3)

使用GetPackageInfo中的System.SysUtils进行操作。它有点参与调用,所以我在这里演示如何将其包装起来以获取包名称:

procedure GetPackageNameInfoProc(const Name: string; NameType: TNameType; Flags: Byte; 
  Param: Pointer);
begin
  if NameType=ntDcpBpiName then begin
    PString(Param)^ := Name;
  end;
end;

function GetPackageName(Package: HMODULE): string;
var
  Flags: Integer;
begin
  // Flags should be an out param, but is a var, so this assignment is a little pointless
  Flags := 0; 
  Result := '';
  GetPackageInfo(Package, @Result, Flags, GetPackageNameInfoProc);
end;

您可以在流程中加载的任何运行时包上使用它。如果要在代码正在执行的包中调用它,请将HInstance传递给GetPackageName