Seite 1 von 2

Proceduren suchen Listen ?

Verfasst: 23.07.2008 09:30
von dater
Hallo,
ich suche eine Möglichkeit, im Programm alle Procduren aufzulisten, und einen Pointer und Name da von zu erstellen?

global dim pointer.l(1000)
global dim procname.s(1000)

;procdure suchen
For i=0 to 1000
?? a=FindProcdure()
?? pointer(i)=a
?? procname(i)=a
next i


so oder so ähnlich....

Dater

Verfasst: 23.07.2008 09:44
von edel
Mit PureBasic ist das nicht moeglich.

Verfasst: 23.07.2008 09:47
von Fluid Byte
Darf man fragen wozu du das benötigst?

Verfasst: 23.07.2008 12:52
von Franky
An sich möglich ist es schon, allerdings nur vor dem Compilieren, nicht zur Laufzeit.

Seit PB 4.0 kann man in der DataSection auch Procedure-Pointer Speichern.

Du könntest dir ein kleines Programm schreiben, das deinen Quelltext durchgeht und alle selbstdeklarierten Proceduren aufsammelt.

Sprich, wo LCASE(Left(Trim(text),9))="procedure", nimmste den LTrim-Teil des Stringfield(mid(text,10),0,"(") und trägst ihn in ne Liste ein.
Am Ende musste dann nur ne Data-Section erstellen lassen ala

Code: Alles auswählen

string="DataSection"+chr(13)+chr(10)+"Adressen:"+Chr(13)+chr(10)
ForEach Funktion()
       string=string+"Data.l @"+Funktion()+"()"+Chr(13)+Chr(10)
Next
string=string+"Namen:"+chr(13)+chr(10)
ForEach Funktion()
   string=string+"Data.s "+chr(34)+Funktion()+"()"+Chr(34)+Chr(13)+Chr(10)
Next 
Lass dir den Code Ausgeben oder als .txt speichern, fertig ist die Datasection

Das musste dann nur noch über Read einlesen in dein Array.
Achja, 3 Dinge

1.)Musst bei "Procedure.s" und so aufpassen, sprich erst gucken, wo ein Rückgabewert deklariert ist, damit du den Namen auch richtig einliest
2.)Schreib auch die Menge der Funktionen in die DataSection, damit du weißt, wo die Adressen aufhören und die Namen beginnen.
3.)Meine Codes hier sind nur Pseudocode, ich will dir ja nicht deine Arbeit wegnehmen ;)
Viel Spass :-D

Verfasst: 24.07.2008 00:40
von AND51
Meine Tests schlugen fehl, aber ich dachte, man könnte zur Laufzeit vielleicht so an die im eigenen Programm gespeicherten Prozedurnamen und -adressen kommen:

Code: Alles auswählen

Procedure eins()
	MessageRequester("", "eins")
EndProcedure
ProcedureDLL zwei()
	MessageRequester("", "zwei")
EndProcedure

If OpenLibrary(1, ProgramFilename())
	If ExamineLibraryFunctions(1)
		While NextLibraryFunction()
			Debug LibraryFunctionName()
			Debug LibraryFunctionAddress()
			Debug ""
		Wend
	Else
		Debug "Kann sich selbst nicht untersuchen"
	EndIf
Else
	Debug "Kann sich selbst nicht öffnen"
EndIf
Gibt bei mir leider einen IMA in Zeile 11. Versteh ich nicht. Die EXE kann zwar geöffnet und untersucht werden, aber laut CountLibraryFunctions() gibt es in der EXE keine Funktionen - wie kann die dann untersucht werden?

Kommentiert man die Zeilen 11 und 12 aus, wird die While-Schleife trotzdem 6x durchlaufen? Weiß jemand, was hier vor sich geht??

Verfasst: 24.07.2008 00:49
von Kaeru Gaman
weil es keine ProcedureDLL deklarationen sind.
für normale Procs werden keine Namen gespeichert und sie sind von außen nicht erreichbar.

wenn ein alter Hase wie edel im zweiten posting dieses threads schreibt "geht nicht",
dann wird da schon was dahinter stecken....

Verfasst: 24.07.2008 01:00
von AND51
> weil es keine ProcedureDLL deklarationen sind
...sagte jemand, der sich den Code nicht genau genug ansah... /:->

> wenn ein alter Hase wie edel im zweiten posting dieses threads schreibt "geht nicht", dan...
...sorry ich vergaß! Kann ja nicht jeder so ein
super-coder
sein... /:->

Verfasst: 24.07.2008 01:14
von Kaeru Gaman
dann hab ich halt nicht richtig hingesehen...

ich schätze mal, die eigentliche schnapsidee dürfte sein,
dass die laufende exe versucht sich selbst als library zu öffnen.

aber da ich nicht wirklich weiß was da vor sich geht,
warte ich halt mal ab, ob sich noch einer erbarmt...

Verfasst: 24.07.2008 07:45
von edel
Kaeru Gaman hat geschrieben: wenn ein alter Hase wie edel im zweiten posting dieses threads schreibt "geht nicht",
dann wird da schon was dahinter stecken....
Was nichts heissen muss.

Die Methode von AND51 kann gar nicht gehen, da PB es voellig egal ist ob
da Procedure oder ProcedureDLL steht. Solange es nicht als DLL kompiliert
wird, wird man da auch nichts auslesen koennen.

Verfasst: 24.07.2008 09:04
von Falko
Fluid Byte hat geschrieben:Darf man fragen wozu du das benötigst?
+1