| Autor |
Beitrag |
Lichtel
Hält's aus hier
Beiträge: 4
|
Verfasst: Do 22.07.04 14:53
Hallo.
Folgende Frage: gibt es irgendeine Möglichkeit innerhalb einer procedure den Namen dieser Prozedur herauszufinden?
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Do 22.07.04 16:01
nein, weil der name ist lediglich ein Mittel für den Programmierer. Beim kompilieren wird dieser entfernt. Es ist dann lediglich noch eine Adresse zu der gesprungen wird.
Wo man eventuell von Namen sprechen kann sind Exporte von DLLs.
grez
msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
raziel
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: Do 22.07.04 17:46
| MSCH hat folgendes geschrieben: | | Wo man eventuell von Namen sprechen kann sind Exporte von DLLs. |
Nicht nur eventuell
Wo man auch noch von Namen sprechen kann, das sind Methoden. Nicht umsonst gibt es die von TObject eingeführten Methoden MethodAddress(const Name: ShortString); und MethodName(Address: Pointer);, mit deren Hilfe man jeweils die Adresse bzw. den Namen der Funktion ermitteln kann.
Habs (noch) nicht probiert:
Du könntest mal versuchen in der Methode (Wichtig! Keine Prozedur, eine Methode!) nach hinten nach "558BEC" (hex) zu suchen. Das ist das Anfang einer jeden Prozedur in Assemblerform: Quelltext 1: 2:
| 55 push ebp 8BEC mov ebp, esp |
Die Adresse, wo das "558BEC" steht speicherst Du in p und übergibst es der self.MethodName(p);.
Das wäre das, was mir dazu einfiele... Wie gesagt, nicht getestet und wenn, dann funktionierts nur bei Methoden!
//edit: Wobei sich mir zumindest justamente die Frage stellt, wie komme ich an die aktuelle Speicheradresse, an der sich der EIP grad befindet...
raziel
_________________ JSXGraph
|
|
maxk
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Do 22.07.04 18:52
Musste man um das zu realisieren das Programm nicht immer in einem Debugger (den man abfragen kann) laufen lassen?
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
raziel
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: Do 22.07.04 19:00
| maxk hat folgendes geschrieben: | | Musste man um das zu realisieren das Programm nicht immer in einem Debugger (den man abfragen kann) laufen lassen? |
Meinst Du wirklich "Musste" oder "Müsste"? Also man müsste nicht, wenn mir einfiele, wie ich die aktuelle Code-Position rausfinden könnte...  Aber wozu das gut sein soll, entzieht sich meiner Kenntnis, denn wenn ich während der Laufzeit rausfinden will, in welcher Prozedur ich bin, dann scroll ich im Delphi-Editfenster ein bisschen nach oben und notier ein kurzes procMemo.Lines.Add(Prozedurname);.
raziel
_________________ JSXGraph
|
|
maxk
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Do 22.07.04 20:03
Ich meine natürlich "müsste", aber den Thread über Rechtschreibung haben wir ja woanders
Wofür eine solche Abfrage gut ist, wüsste ich auch gerne. Und wie du ja schon sagtest, weiss man ja wo man sich befindet, wenn man den Code reinschreibt, um rauszufinden, wo man sich befindet 
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Do 22.07.04 23:07
| raziel hat folgendes geschrieben: | ...Wo man auch noch von Namen sprechen kann, das sind Methoden. Nicht umsonst gibt es die von TObject eingeführten Methoden MethodAddress(const Name: ShortString); und MethodName(Address: Pointer);, mit deren Hilfe man jeweils die Adresse bzw. den Namen der Funktion ermitteln kann.
Habs (noch) nicht probiert:... |
Die idee ist gut, hat aber leider einen entscheidenen hacken: MethodAddress und MethodName sind RTTI funktionen und die steht leider nur im published abschnitt zur verfügung. Also geht das nicht mit jeder beliebigen methode.
schade!
_________________ mfg.
mâximôv
|
|
raziel
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: Fr 23.07.04 09:51
Aber wenigstens mit den published Methoden (auch wenn mir nach wie vor jedweder Sinn der Sache ferngeblieben ist... Klär uns auf Lichtel  ):
1: 2: 3: 4: 5: 6: 7: 8: 9: 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: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TOAAHW = packed record b1, b2, b3: Byte; end;
TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1; function CheckForProcEntry(ToCheck: TOAAHW): Boolean;
implementation
{$R *.dfm}
function CheckForProcEntry(ToCheck: TOAAHW): Boolean; begin result := false; if (ToCheck.b1 = $55) and (ToCheck.b2 = $8B) and (ToCheck.b3 = $EC) then result := true; end;
procedure TForm1.Button1Click(Sender: TObject); var p: ^Pointer; i, j: Integer; poaahw: ^TOAAHW; begin asm jmp @thecall; @callme: mov p, esp; ret; @thecall: call @callme; end;
j := Integer(p^); p := nil;
for i := j downto j-200 do begin poaahw := Pointer(i); if CheckForProcEntry(poaahw^) then begin p := Pointer(i); break; end; end;
if p <> nil then showmessage(inttohex(Integer(p), 8) + ': ' + Self.MethodName(p)) else showmessage('nüscht :('); end;
end. |
raziel
_________________ JSXGraph
|
|
obbschtkuche
Gast
Erhaltene Danke: 1
|
Verfasst: Sa 24.07.04 18:13
| raziel hat folgendes geschrieben: | Das ist das Anfang einer jeden Prozedur in Assemblerform: Quelltext 1: 2:
| 55 push ebp 8BEC mov ebp, esp | |
Nur der Form halber: Das trifft nur bei Prozeduren/Funktionen mit Parameter(n) und/oder lokaler/n Variable(n) zu, ansonsten gibt es nichts was man Header nennen könnte.
RTTI wird für die Formulare benötigt.
|
|
|