Здравствуйте, Dimonka, Вы писали:
D>Здравствуйте, Аноним, Вы писали:
А>>Вот дописываю оди интерпретатор ...
А>>И для полного счасться мне не хватает всего лишь получить список методов для любого обьекта Delphi.
А>>Подскажите кто нить , как его извлеч из VMT.
D>Как-как.. никак..
D>Люди пишут парсеры исходников и по ним строят обёртки для компонент / классов. В рантайме получить неопубликованные свойства классов не получится..
Мне не нужны свойства — мне нужны методы , а они все есть в VMT.
А делфовый rtti — позволяет узнать имя метода класса по указателю
TClass.MethodName(pinter);
Вот юзаю пример из
Обработка абстрактных методов в DelphiАвтор(ы): Антон Злыгостев
Дата: 18.02.2003
Данная статья описывает метод получения дополнительной информации при вызове абстрактного метода во время выполнения. В Delphi такой вызов технически возможен и является ошибкой.
Стандартная библиотека лишь регистрирует факт возниконовения этой ошибки, не предоставляя никой информации о контексте. Предлагаемый метод позволяет выяснить имя класса и номера слотов VMT, соответствующих абстрактным методам.
а именно:
class function TAbstractHandler.DetectAbstracts(AClass: TClass;
out Abstracts: TMIRArray): boolean;
var
VMT: PPointer;
VMTEnd: Pointer;
begin
TClass(VMT):= AClass;
VMTEnd:=GetVMTEnd(AClass);
SetLength(Abstracts, 0);
while (VMT<>VMTEnd) // Сканируем VMT
do begin
if IsMethodAbstract(VMT^)
then begin
SetLength(Abstracts, Length(Abstracts)+1); // Добавляем запись
with Abstracts[High(Abstracts)] do
begin
VMTIndex:= (Integer(VMT)-Integer(AClass)) shr 2; // размер слота - 4 байта
ClassType:= GetFirstDeclarator(AClass, VMTIndex);
// вот тут и надо вписать что-то типа TClass(AClass).MethodName(Integer(VMT)+Integer(AClass)); или я ошибаюсь
end;
end;
Inc(VMT);
end;
Result:= Length(Abstracts)>0; // Сигнализируем, успешен ли поиск.
end;