Вот дописываю оди интерпретатор ...
И для полного счасться мне не хватает всего лишь получить список методов для любого обьекта Delphi.
Подскажите кто нить , как его извлеч из VMT.
Здравствуйте, Аноним, Вы писали:
А>Вот дописываю оди интерпретатор ... А>И для полного счасться мне не хватает всего лишь получить список методов для любого обьекта Delphi. А>Подскажите кто нить , как его извлеч из VMT.
Как-как.. никак..
Люди пишут парсеры исходников и по ним строят обёртки для компонент / классов. В рантайме получить неопубликованные свойства классов не получится..
Re[2]: Список методов из VMT
От:
Аноним
Дата:
09.05.05 16:21
Оценка:
Здравствуйте, Dimonka, Вы писали:
D>Здравствуйте, Аноним, Вы писали:
А>>Вот дописываю оди интерпретатор ... А>>И для полного счасться мне не хватает всего лишь получить список методов для любого обьекта Delphi. А>>Подскажите кто нить , как его извлеч из VMT.
D>Как-как.. никак.. D>Люди пишут парсеры исходников и по ним строят обёртки для компонент / классов. В рантайме получить неопубликованные свойства классов не получится..
Мне не нужны свойства — мне нужны методы , а они все есть в VMT.
А делфовый rtti — позволяет узнать имя метода класса по указателю
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) // Сканируем VMTdo 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;
Ну и что тебе может дать имя метода без параметров и результата?
Re[3]: Список методов из VMT
От:
Аноним
Дата:
10.05.05 07:21
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Мне не нужны свойства — мне нужны методы , а они все есть в VMT. А>А делфовый rtti — позволяет узнать имя метода класса по указателю
А>TClass.MethodName(pinter);
А>Вот юзаю пример из Обработка абстрактных методов в Delphi
procedure GetMethodNames(aClass: TClass; List: TStrings);
type
TMethodTable = packed record
Count: SmallInt;
//[...methods...]end;
var
aTable : ^TMethodTable;
aName : ^ShortString;
K : Integer;
begin
List.BeginUpdate;
try
while aClass <> nil do
begin
asm
mov EAX, [aClass]
mov EAX,[EAX].vmtMethodTable { fetch pointer to method table }
mov [aTable], EAX
end;
if aTable <> nil then
begin
aName := Pointer(PChar(aTable) + 8);
for K := 1 to aTable.Count do
begin
if List.IndexOf (aName^) < 0 then
List.Add (aName^);
aName := Pointer(PChar(aName) + length(aName^) + 7)
end;
end;
aClass := aClass.ClassParent;
end;
finally
List.EndUpdate;
end;
end;
Учти, работает только в случае когда метод published
Здравствуйте, ZendCoder, Вы писали:
ZC>Здравствуйте, Danchik:
ZC>Да — но это не работает! И из VMT можно достать все!!! методы , кроме, если я не ошибаюсь , динамических .
ZC>Сразу после вызова aTable = nil
ZC>пишу GetMethodNames(TForm,memo1.Lines);
Елки палки. Фома ты неверующий.
Понаписывай свои методы, не published, сделай их вызовы (чтоб вкомпилилось) и попробуй поискать названия этих методов в EXE файле. Если найдеш:
Я съем свой котелок
Мистер Фикс (с)
Советую переходить на .NET — там ты все достанеш из RTTI.
Названия методов можна доставать у интерфейсов, порожденных от IInvoke (Кажется начиная с Delphi 6). Причем можна вытянуть информацию о параметрах.
Сделано борландовцами для поддержки SOAP.
См. IntfInfo.pas