Einzelnen Beitrag anzeigen

Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Rücksprungadresse ermitteln

  Alt 12. Jul 2008, 10:06
Das geht meines Wissens nur mit Inline-Assembler. Und da gibt es auch zwei verschiedene Varianten, je nachdem, ob der Compiler einen Stackframe emittiert.
Mit Stackframe:
Delphi-Quellcode:
asm
mov eax, [ebp+4]
mov Addr, eax
end;
Ohne Stackframe:
Delphi-Quellcode:
asm
mov eax, [esp]
mov Addr, eax
end;
Problematisch wird es, wenn der Compiler Addr in einem der Register esi, edi oder ebx ablegt - dann funktioniert keine der obigen Möglichkeiten ohne Änderung. Um sicher zu gehen gibt es zwei Möglichkeiten:
1. Optimierung vor der Routine abschalten {$O-} und die Variante mit Stackframe verwenden.
2. Eine Hilfsroutine verwenden:
Delphi-Quellcode:
procedure InternalRaiseException(const ErrorMessage: string; ErrorAddr: Pointer);
begin
  raise Exception.CreateFmt('Fehler in KlasseXY: %s', [errormessage]) at addr;
end;
 
procedure TKlasseXY.SetError(const errormessage:string);
asm
  mov edx, [esp]
  call InternalRaiseException
end;
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat