Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.47 MB
Время: 0.007 c
1-42429
VID
2001-12-22 16:28
2002.01.14
Выделение слова из строки


1-42410
AVS
2001-12-25 19:09
2002.01.14
access public method


14-42544
Tosov
2001-11-16 17:18
2002.01.14
HDD: Что выбрать


1-42434
som
2001-12-24 10:12
2002.01.14
Графика


1-42418
Wetnose
2001-12-27 07:09
2002.01.14
KeyDown для ScrollBar a





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский