【问题标题】:Get current package name on initialization初始化时获取当前包名
【发布时间】:2018-02-03 20:43:47
【问题描述】:

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

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

因此我可以通过工厂方法创建一个引用特定上下文的实例

例子:

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

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

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

【问题讨论】:

  • GetModuleName(HInstance) 呢?
  • 获得的文件名可能不等于包名。一个很好的例子是版本化的包。例如,名为rtl 的包可能具有类似rtl210.bpl 的文件名。

标签: delphi initialization package


【解决方案1】:

使用来自System.SysUtilsGetPackageInfo 执行此操作。调用起来有点麻烦,这里我演示一下如何打包获取包名:

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

【讨论】:

    猜你喜欢
    • 2012-07-23
    • 2019-02-14
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    相关资源
    最近更新 更多