Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];




Вниз

access public method 


AVS   (2001-12-25 19:09) [0]

можно ли узнать какие есть public методы у обьекта в run-time



Алексей Петров   (2001-12-26 08:44) [1]

public - нет. Только published.
Об остальном - можно попытаться догадаться :) например из VMT можно вытащить перечень всех выртуальных функций, включая private и protected, ...



Иван Шихалев   (2001-12-26 17:31) [2]

> например из VMT можно вытащить перечень всех выртуальных функций

Без имен, параметров и т.д. - голые адреса. Много догадываться придется, однако.



Юрий Зотов   (2001-12-26 18:42) [3]

> Алексей Петров © (26.12.01 08:44)
Не только published. И не только виртуальных.


> Иван Шихалев © (26.12.01 17:31)
С именами.


> All
Вот выдержка из описания VMT.

Offset Description
–76 pointer to virtual method table (or nil)
...
–52 pointer to method definition table (or nil)
–48 pointer to dynamic method table (or nil)

Как видим, VMT содержит в себе адреса других таблиц, пройдясь по которым можно вытащить и методы, и их имена (имена в виде ShortString хранятся в этих же таблицах). Повторив ту же операцию для классов-предков, получаем полный список методов, включая унаследованные.

Причем это не только теория, такое я делал на практике. Код, к сожалению, привести не могу - хотя он мой в смысле авторства, но не мой в смысле собственности (делалось по работе).



vuk   (2001-12-26 20:03) [4]

И все-таки с именами - только published (ну и еще, правда, automated).

В D6 введена RTTI для интерфейсов и в связи с этим есть одна интересная возможность - можно по информации о типе для интерфейса (если она, конечно, сгенерирована) получить не только все имена методов интерфейса, но и списки параметров с их именами, типами, форматами вызовов и т.п. Я для прикола сделал програмку, которая восстанавливает текст определения интерфейса практически в том же виде, как он в исходнике записан...



iZEN   (2001-12-26 20:17) [5]

Такое было ещё в OLEnterprise в году так э...1997. И MS тоже поставляла к своим инструментам вьюер потрохов классов.



Иван Шихалев   (2001-12-26 20:26) [6]

to vuk

> Я для прикола сделал програмку, которая восстанавливает текст
> определения интерфейса практически в том же виде, как он
> в исходнике записан...


А выложить не жалко?



vuk   (2001-12-26 21:02) [7]

to iZEN:
OLEnterprise не является языковым средством. В D6 это все работает на уровне компилятора и RTTI. Там все это добро при реализации SOAP используется.

to Иван Шихалев:
Не жалко. Только не сейчас. Она у меня дома, а я на работе. Опять же причесать ее надо, в удобоваримый вид привести. Может через пару дней я это сделаю...



Бурундук   (2001-12-26 21:44) [8]

Получение опубликованных методов формы:

procedure TMainForm.BShowMethodsClick(Sender: TObject);
var
MethodIterator: TPublishedMethodIterator;
Cls: TClass;
begin
ListBox.Clear;
MethodIterator := TPublishedMethodIterator.Create;
Cls := ClassType;

try
with MethodIterator do
begin
// while Cls <> nil do
// begin
Init(Cls);
ListBox.Items.Add(Format("%s, %d methods",[TClass(VMT).ClassName, GetMethodCount]));
First;
while (Current <> nil) do
begin
ListBox.Items.Add(Format(" %s: $%p",[Current^.Name, Current^.Address]));
Next;
end;
// Cls := Cls.ClassParent;
// end;
end;
finally
MethodIterator.Free;
end;
end;

//---------------------------------------------------------//
unit PubMeth;

interface

uses
Classes, TypInfo;

type

PVmtMethod = ^TVmtMethod;
TVmtMethod = packed record
Size: Word;
Address: Pointer;
Name: ShortString;
end;

PVmtMethodTable = ^TVmtMethodTable;

TVmtMethodTable = packed record
Count: Word;
Methods: array [0..MaxListSize] of byte;
{ Methods : array [0..Count] of TVmtMethod;}
end;

TPublishedMethodIterator = class
private
FVMT: Pointer;
FMethodTable: PVmtMethodTable;
FCurrent: PVmtMethod;
FCurrentIndex: Integer;
function CurrentLength: Integer;
public
property VMT: Pointer read FVMT;
property Current: PVmtMethod read FCurrent;
function GetMethodCount: Integer;
procedure Init(AClass: TClass);
function First: PVmtMethod;
function Next: PVmtMethod;
end;

function OffsetPtr(P: Pointer; Offset: Integer): Pointer;

implementation

function OffsetPtr(P: Pointer; Offset: Integer): Pointer;
begin
Integer(Result) := Integer(P) + OffSet;
end;

{ TPublishedMethodIterator }

function TPublishedMethodIterator.GetMethodCount: Integer;
begin
Result := 0;
if not Assigned(FMethodTable) then Exit;

Result := FMethodTable^.Count;
end;

procedure TPublishedMethodIterator.Init(AClass: TClass);
begin
FMethodTable := nil;
FVMT := Pointer(AClass);
FMethodTable := Pointer( OffsetPtr(FVMT, vmtMethodTable)^ );
FCurrent := nil;
end;

function TPublishedMethodIterator.First: PVmtMethod;
begin
Result := nil;
FCurrentIndex := 0;
if not Assigned(FMethodTable) then Exit;

FCurrent := Pointer(@FMethodTable.Methods[0]);
Result := FCurrent;
end;

function TPublishedMethodIterator.CurrentLength: Integer;
begin
Result := 0;
if not Assigned(FCurrent) then Exit;

Result := Current^.Size; // SizeOf(Word) + SizeOf(Pointer) + Length(Current^.Name) + 1;
end;

function TPublishedMethodIterator.Next: PVmtMethod;
begin
Result := nil;
if not Assigned(FMethodTable) then Exit;

if FCurrentIndex + 1 >= GetMethodCount then
begin
FCurrent := nil;
end
else
begin
FCurrent := OffsetPtr(FCurrent, CurrentLength);
Inc(FCurrentIndex);
end;
Result := FCurrent;
end;

end.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.016 c
1-42478           ВС                    2001-12-25 15:38  2002.01.14  
Как с помощью компонента NMHTTP закачать все содержимое


3-42356           bk                    2001-12-09 16:30  2002.01.14  
Probeli V ADO


14-42573          РУС                   2001-11-11 20:35  2002.01.14  
Стоит ли ставить Win XP?


4-42604           Vladimir P            2001-11-12 16:57  2002.01.14  
Как послать системе Ctrl+Alt+Del ?


1-42412           RoadRunner            2001-12-26 17:17  2002.01.14  
Проблема с записью в файл