最近、このフォーラムに質問を投稿し、DXE2 実行可能ファイルで RTTI 情報が欠落していることについてアドバイスを求めました。
その投稿は、私の実際のケースの簡素化されたバージョンでした。RRUZ が助けに来てくれたので、簡素化されたバージョンはすぐに解決されました。ただし、元の問題はまだ残っているため、現在完全に投稿しています。"主要":
program MissingRTTI;
{$APPTYPE CONSOLE}
uses
System.SysUtils, RTTI, MyUnit in 'MyUnit.pas', RTTIUtil in 'RTTIUtil.pas';
var
RHelp: TRttiHelper;
begin
RHelp := TRttiHelper.Create();
if (RHelp.IsTypeFound('MyUnit.TMyClass')) then WriteLn('TMyClass was found.')
else WriteLn('TMyClass was not found.');
ReadLn;
RHelp.Free();
end.
RTTIUtil.pas
:
unit RTTIUtil;
interface
uses
MyUnit;
type
TRttiHelper = class(TObject)
public
function IsTypeFound(TypeName: string) : boolean;
end;
implementation
uses
RTTI;
function TRttiHelper.IsTypeFound(TypeName: string): boolean;
var
rCtx: TRttiContext;
rType: TRttiType;
begin
Result := false;
rCtx := TRttiContext.Create();
rType := rCtx.FindType(TypeName);
if (rType <> nil) then
Result := true;
rCtx.Free();
end;
end.
そして最後にMyUnit.pas
:
unit MyUnit;
interface
type
TMyClass = class(TObject)
end;
implementation
end.
目的のタイプが見つかりません。ただし、TRttiHelper.IsTypeFound
のインスタンスをインスタンス化する (そしてすぐに解放する) ように変更するとTMyClass
、型が見つかります。そのようです:
function TRttiHelper.IsTypeFound(TypeName: string): boolean;
var
rCtx: TRttiContext;
rType: TRttiType;
MyObj: TMyClass;
begin
Result := false;
MyObj:= TMyClass.Create();
MyObj.Free();
rCtx := TRttiContext.Create();
...
TMyClass
それで、実際にインスタンス化せずにRTTIを強制的に発行できる方法はありますか?
アップデート:
反対に、 を使用して TRttiType をフェッチしようとするとTRttiContext.GetType
、目的の型が見つかることを言及するかもしれません。したがって、いくつかの RTTI が放出されます。TRttiType.IsPublic
によって取得されたプロパティをチェックするTRttiContext.GetType
と、真の値が得られます。つまり、取得された型は public です (したがって、 を使用して特定できるはずですTRttiContext.FindType
)。