我的应用程序动态加载提供我需要的对象实现的包。我有一个全局函数来在列表结构上注册对象类,我用它来动态创建实例。
procedure RegisterObjectStd(const APackageName, AObjectName: string; const AClass: TClass);
因此,我可以通过工厂方法
创建一个引用特定上下文的实例示例:
function CreateObject(const APackageName, AObjectName: string): TObject;
有没有办法在初始化代码中以动态方式检索当前包的名称(.bpl)?
initialization
RegisterObjectStd(GetCurrentBplName, 'MyObjectName', TMyObjectClass);
答案 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
。