Proceduren suchen Listen ?

Anfängerfragen zum Programmieren mit PureBasic.
dater
Beiträge: 43
Registriert: 14.01.2006 15:22

Proceduren suchen Listen ?

Beitrag 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
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Mit PureBasic ist das nicht moeglich.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Darf man fragen wozu du das benötigst?
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Beitrag 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
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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??
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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... /:->
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Fluid Byte hat geschrieben:Darf man fragen wozu du das benötigst?
+1
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten