Re[2]: Список методов из VMT
От: Аноним  
Дата: 09.05.05 16:21
Оценка:
Здравствуйте, 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;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.