Наскоро публикувах въпрос в този форум с молба за всякакви съвети относно липсваща RTTI информация в DXE2 изпълним файл.
Тази публикация беше съкратена версия на действителния ми случай. 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();
...
Така че се чудя има ли някакъв начин да накарам RTTI да се излъчва за TMyClass
, без всъщност да го инстанцирам?
Актуализация:
От друга страна, бих могъл да спомена, че ако се опитам да извлека TRttiType с помощта на TRttiContext.GetType
, желаният тип се намира. Така че има излъчван RTTI. Проверката на свойството TRttiType.IsPublic
като извлечено от TRttiContext.GetType
дава истинска стойност, т.е. извлеченият тип е публичен (и следователно трябва да е възможно да се намери с помощта на TRttiContext.FindType
).