![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Имя метода или функции [D6]
kull © (2002-04-17 12:21:00)Привет всем!
Давно мучающий меня вопрос:
А можно ли каким либо способом, находясь внутри метода, узнать его имя.
Интересуют не только published, но и private,public и protected методы.
MBo (2002-04-17 14:19:00) [1]Этот вопрос несколько раз видел в конфах borland, ответы уклончивые. (анекдот такой есть)
В нашем форуме я тоже поднимал этот вопрос - гуру, к сожалению, не заинтересовались.
вот чего я придумывал, полумеры, конечно.
недо-решение 1 для published
procedure TForm1.Button1Click(Sender: TObject);
var p:pbyte;
function DummyFunc: Pointer;
asm
xor eax, eax
end;
begin
p:=@DummyFunc;
inc(p,4);
label3.caption:=classname+"."+methodname(p);
end;
недо-решение 2
function ACaller:pointer;
asm
mov eax, [esp]
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
var p,p1:pbyte;
begin
p1:=ACaller;
dec(p1,53);
//53-магическое число, зависит от пролога процедуры, например, инициализации строк или дин. массивов
p:=methodaddress("CheckBox1Click");
label3.caption:=inttohex(cardinal(p),8);//для контроля
label4.caption:=inttohex(cardinal(p1),8);
label2.caption:=classname+"."+methodname(p1);
end;
Куда смотреть -
1) изучать состояние стека - кропотливо разбираться надо,
поскольку у задачи практического смысла мало, я не вникал пока
2) генерировать detailed map (linker)
3) сопоставлять адреса из VMT и DMT c текущими
Игорь Шевченко (2002-04-17 13:52:00) [2]День добрый,
Конечно! Достаточно посмотреть на имя функции или метода :-)
С уважением,