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;