2016-12-14 2 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

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으로 전달하십시오.