Seite 1 von 2
dynamischer Aufruf von Modulen
Verfasst: 07.02.2014 01:51
von SBond
Hi Leute,
ich möchte ein Programm schreiben, dass gewisserweise modular aufgebaut wird. So soll das Hauptprogramm bestimmte Plugins verwalten.
Jedes Plugin ist in PureBasic ein Modul und besitzt eine bestimmte Struktur.
einfaches Beispiel:
...z.B. drei Plugins, die jeweils eine Prozedur beinhalten:
Plugin_A: Init()
Plugin_B: Init()
Plugin_C: Init()
Wenn das Hauptprogramm gestartet wird, sollen die Init()-Prozeduren aller Plugins aufgerufen werden.
Nun könnte ich beim Programmstart folgendes machen:
das würde auch funktionieren, aber kann man so etwas auch automatisieren? Kann man z.B. statt "Plugin_A" eine art Variable oder Platzhalter verwenden?
Code: Alles auswählen
aktuelles_Plugin$ = "Plugin_A"
aktuelles_Plugin$:Init()
...ich weiß nicht wie ich es lösen kann. Wie gehe ich an so etwas ran, wenn ich eine variable Zahl von Plugins habe, von dem jeweils nur der Modulname bekannt ist?
viele Grüße,
SBond
Re: dynamischer Aufruf von Modulen
Verfasst: 07.02.2014 02:08
von NicTheQuick
Das kannst du nicht machen, da Module schon während dem Kompilieren umgesetzt werden. In der EXE-Datei ist später nichts mehr von den Modulen zu sehen, also kannst du auch nicht zur Laufzeit bestimmten, was zu machen ist.
Du kannst aber Prototypen und Maps mit Funktionspointern nutzen:
Code: Alles auswählen
Prototype.i Prototype_Init()
Structure Plugin_Wrapper
init.Prototype_Init
EndStructure
Global NewMap PluginMap.Plugin_Wrapper()
DeclareModule Plugin_A
Declare.i Init()
EndDeclareModule
Module Plugin_A
Procedure.i Init()
Debug "Ich bin Plugin_A::Init()"
EndProcedure
EndModule
PluginMap("Plugin_A")\init = Plugin_A::@Init()
DeclareModule Plugin_B
Declare.i Init()
EndDeclareModule
Module Plugin_B
Procedure.i Init()
Debug "Ich bin Plugin_B::Init()"
EndProcedure
EndModule
PluginMap("Plugin_B")\init = Plugin_B::@Init()
;Main
PluginMap("Plugin_A")\init()
PluginMap("Plugin_B")\init()
Leider lässt Purebasic wohl ein einfaches '@Plugin_B::Init()' nicht zu. Außerdem kann man Prototypes aus irgendeinem Grund auch nicht direkt als Typ für eine Map nutzen. Man muss das ganze in eine Structure kapseln. Wieder mal zwei Merkwürdigkeiten à la Fred.
Edit:
Es geht doch ohne UseModule, allerdings muss das @ eben nach die zwei Doppelpunkte. Danke Danilo.
Re: dynamischer Aufruf von Modulen
Verfasst: 07.02.2014 02:14
von SBond
vielen Dank
Habe mit Maps und Prototypes noch nicht gearbeitet, aber eventuell könnte es helfen.
danke dir erstmal

Re: dynamischer Aufruf von Modulen
Verfasst: 07.02.2014 07:44
von Danilo
NicTheQuick hat geschrieben:Leider lässt Purebasic wohl ein einfaches '@Plugin_B::Init()' nicht zu.
Fred meinte das sieht schöner aus:
Re: dynamischer Aufruf von Modulen
Verfasst: 07.02.2014 09:00
von helpy
Schaut Euch doch mal das Framework
PureWork von
Hroudtwolf an.
lg,
guido
Re: dynamischer Aufruf von Modulen
Verfasst: 07.02.2014 11:45
von NicTheQuick
Danilo hat geschrieben:Fred meinte das sieht schöner aus:

Alles klar. Dann eben so. Merkwürdig sieht es dann aber trotzdem noch aus.

Re: dynamischer Aufruf von Modulen
Verfasst: 07.02.2014 12:45
von SBond
super
dankeschön

Re: dynamischer Aufruf von Modulen
Verfasst: 07.02.2014 12:53
von ts-soft
Ich denke mal, ich habe was übersehen, aber Module können sich doch selber Initialisieren.
Code ausserhalb von Proceduren wird doch einmalig automatisch ausgeführt, dort könnte
auch zum Beispiel eine Init() Funktion aufgerufen werden.
Re: dynamischer Aufruf von Modulen
Verfasst: 07.02.2014 13:37
von NicTheQuick
Ach, tatsächlich. Und ich dachte das passiert nur, wenn man UseModule nutzt.

Man kann dann nur immer noch nicht dynamisch ein Modul nach Namen "starten" oder nicht. Das legt dann der Quellcode fest.
Re: dynamischer Aufruf von Modulen
Verfasst: 07.02.2014 13:52
von ts-soft
NicTheQuick hat geschrieben:Ach, tatsächlich. Und ich dachte das passiert nur, wenn man UseModule nutzt.
Code: Alles auswählen
DeclareModule test
Declare GetBla()
EndDeclareModule
Module test
Global bla.i = 100
Procedure GetBla()
ProcedureReturn bla
EndProcedure
Procedure Init()
bla = 200
EndProcedure
Init()
EndModule
Debug test::GetBla()
NicTheQuick hat geschrieben:Man kann dann nur immer noch nicht dynamisch ein Modul nach Namen "starten" oder nicht. Das legt dann der Quellcode fest.
Wenn ich jetzt wüßte, was dynamisches Starten eines Modules sein soll? Module werden statisch gelinkt, sind also immer
vorhanden.
Gruß
Thomas