Недавно я разместил на этом форуме вопрос с просьбой дать совет относительно отсутствующей информации RTTI. в исполняемом файле DXE2.
Этот пост был урезанной версией моего настоящего дела. На помощь пришел РРУЗ, и поэтому урезанная версия была быстро решена. Однако исходная проблема все еще существует, и поэтому я публикую ее полностью. "Главный":
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
).