2016-12-14 15 views
2

私のアプリケーションは、必要なオブジェクトの実装を提供するパッケージを動的に読み込みます。私はインスタンス構造を動的に作成するために使用するリスト構造にオブジェクトクラスを登録するグローバル関数を持っています。初期化時に現在のパッケージ名を取得する

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

これにより、私はファクトリメソッド

例を通じて特定のコンテキストを基準にしてインスタンスを作成することができますdinamically現在のパッケージ(の名前を取得する方法はあり

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

を。 bpl)私の初期化コードですか?

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

'GetModuleName(HInstance)'についてはどうですか? –

+1

これは、潜在的にパッケージ名と同じではないファイル名を取得します。良い例はバージョン管理されたパッケージです。例えば、 'rtl'という名前のパッケージは' rtl210.bpl'のようなファイル名を持つかもしれません。 –

答えて

3

System.SysUtilsからGetPackageInfoを使用しています。

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; 

あなたのプロセスにロードされた任意のランタイムパッケージでこれを使用することができます:それはので、ここで私は、パッケージ名を取得するためにそれをラップする方法を示し、呼び出すために少し関わっです。コードが実行されているパッケージで呼び出す場合は、HInstanceGetPackageNameに渡します。

関連する問題