- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
// Получение имени выполняемого метода, вызывать можно только из Published-методов класса.
// Для обычных методов: FindClassMethodNames(ClassType()), для статических методов FindClassMethodNames(self).
{$optimization OFF}
function FindClassMethodNames(obj: TClass): string;
var _AdrPtr: Pointer;
begin
  asm
    mov eax, obj
    mov edx, dword ptr [esp + 272]
    push ebx
    push esi
    push edi
    push $7FFFFFFF
    xor edi, edi
    jmp @@haveVMT
   @@outer:
    mov eax, dword ptr [eax]
   @@haveVMT:
    mov esi, dword ptr [eax].vmtMethodTable
    test esi, esi
    je @@parent
    movzx ecx, word ptr [esi]
    add esi, 2
   @@inner:
    pop ebx
    push edx
    sub edx, dword ptr [esi + 2]
    jl @@no1
    cmp edx, ebx
    jg @@no1
    mov ebx, edx
    mov edx, dword ptr [esi + 2]
    mov edi, edx
   @@no1:
    pop edx
    push ebx
    movzx ebx, word ptr [esi]
    add esi, ebx
    dec ecx
    jnz @@inner
   @@parent:
    mov eax, dword ptr [eax].vmtParent
    test eax, eax
    jne @@outer
    mov _AdrPtr, edi
    pop edi
    pop esi
    pop ebx
  end;
  Result := obj.MethodName(_AdrPtr);
end;
{$optimization ON}
// пример использования
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(FindClassMethodNames(ClassType()));
end;
 Follow us!
 Follow us!