Форум: "Основная";
Текущий архив: 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.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c