Proceduren suchen Listen ?
Proceduren suchen Listen ?
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
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
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
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
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
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
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

Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden 

Meine Tests schlugen fehl, aber ich dachte, man könnte zur Laufzeit vielleicht so an die im eigenen Programm gespeicherten Prozedurnamen und -adressen kommen: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??
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
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
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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....
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.
Der Weise weiß, dass er ein Narr ist.
> 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
...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
sein...super-coder

PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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...
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.
Der Weise weiß, dass er ein Narr ist.
Was nichts heissen muss.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....
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.
- 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: