2016-12-14 66 views
2

我的應用程序動態加載提供我需要的對象實現的包。我有一個全局函數用來在我用來動態創建實例的列表結構上註冊對象類。初始化時獲取當前包名

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

由此我可以通過工廠方法創建引用到特定上下文實例

實施例:

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

有一種方法來dinamically檢索當前包的名稱(。 bpl)在我的初始化代碼?

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

'GetModuleName(HInstance)'怎麼辦? –

+1

可能會得到可能不等於包名的文件名。一個很好的例子是版本化的軟件包。例如,名爲'rtl'的軟件包可能有一個像'rtl210.bpl'這樣的文件名。 –

回答

3

做它用GetPackageInfoSystem.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