Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Name der Procedure rausfinden
christianrein - Di 03.02.09 12:36
Titel: Name der Procedure rausfinden
Hallo,
ich suche nun schon seit ein paar Tagen nach einer Lösung, und zwar suche ich eine Funktion mit der ich den Namen der aufrufenden Procedure rausfinden kann. Also z.B.:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure log(text : string); begin showmessage("aufrufendeprocedure" + text); end;
procedure irgendwas(); begin log('Es ist ein Fehler aufgetreten'); end; |
Ich benötige das ganze um ein anstendiges Log Module für meine Anwendung zu schreiben und möchte nicht jedesmal den Namen händisch eintragen müssen.
Moderiert von
Christian S.: Delphi-Tags hinzugefügt
jaenicke - Di 03.02.09 15:03
Hallo und :welcome: im Forum!
Ich glaube da wirst du nicht drum herumkommen. Der Grund ist einfach: Die Namen der Prozeduren werden beim Kompilieren durch ihre Adressen ersetzt und sind (zumindest ohne Debuginformationen) nicht mehr in der Exe enthalten.
Du könntest also höchstens diesen Zahlenwert loggen, müsstest dann aber jedesmal erst die zugehörige Prozedur heraussuchen, wenn du deren Namen brauchst. Diesen Wert müsstest du via Assembler relativ einfach bekommen, denn der steht ja im Aufrufstack (direkt aus der Logprozedur heraus meine ich kannst du den dann bekommen).
christianrein - Di 03.02.09 15:24
Doch noch eine Frage, wie kann ich denn die Addresse von der Prozedur bekommen ? Damit wäre mir auch schon geholfen. Danke
Hmm schade, ich dachte das man da vielleicht was mit methodname(methodaddress('')); machen kann. Wobei ich dann wieder bei MethodAddress den Prozedurenamen als String angeben muss. Na ja dann werde ich mir wohl doch die Arbeit machen müssen. Aber trotzdem Vielen Dank.
jaenicke - Di 03.02.09 15:39
christianrein hat folgendes geschrieben : |
| Hmm schade, ich dachte das man da vielleicht was mit methodname(methodaddress('')); machen kann. Wobei ich dann wieder bei MethodAddress den Prozedurenamen als String angeben muss. |
Wenn du das so ähnlich machen willst, dann kannst du wie gesagt die Adressen auslesen. Du könntest dann die Adressen aller Methoden manuell in die Liste eintragen, müsstest das aber nur an einer Stelle machen. Dort übersetzt du dann die Adresse in den Namen.
christianrein hat folgendes geschrieben : |
| Doch noch eine Frage, wie kann ich denn die Addresse von der Prozedur bekommen ? Damit wäre mir auch schon geholfen. |
Schau dir einmal die Seite an:
http://www.clevercomponents.com/articles/article012/exwatcher.asp
Ohne die Debuginformationen kommst du zwar auch dort nicht an die Namen direkt heran, aber du siehst dort wie du den Aufrufstack auslesen kannst und auch wie du die Namen dazu bekommst, wenn du mit Debuginformationen kompilierst.
Hier findest du auch etwas bei MS selbst:
http://msdn.microsoft.com/en-us/library/ms680650.aspx
jaenicke - Di 03.02.09 18:21
Luckie hat folgendes geschrieben : |
| Und die Tabelle darf er bei jeder Änderung im Quelltrext anpassen. |
Warum das? :shock: Das kann das Programm doch selbst tun. Man muss ja nur die entsprechenden Methoden in die Liste schreiben. Deren Adressen findet das Programm doch alleine.
Boldar - Di 03.02.09 19:21
mir fällt gerade noch was ein: in einer dll werden prozeduren doch auch über ihre namen definiert.
Ich meine, ich hatte mal irgendwo ein Beispiel gesehen, wo eine Exe auch proceduren exportierte, und diese aus einer Kopie seiner selbst geladen hat (für einen globalen Hook).
Villeicht lässt sich ja in dieser Hinsich was machen...
BenBE - Di 03.02.09 23:32
Siehe Omorphia Debug Interface. Gibt's bei Sourceforge als Teil des Projekt Omorphia. Ist zwar nicht ganz einfach einzubinden, damit kann man das aber problemlos realisieren. Benötigt die Debug-Infos extern; damit kann man das aber wenn nötig von der EXE getrennt weitergeben. Mehr Infos gibt's auch, wenn Du hier im Forum mal nach OmMAP suchst.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!