Seite 2 von 2

Re: dynamischer Aufruf von Modulen

Verfasst: 07.02.2014 14:09
von NicTheQuick
ts-soft hat geschrieben:
NicTheQuick hat geschrieben:Ach, tatsächlich. Und ich dachte das passiert nur, wenn man UseModule nutzt. :doh:

Code: Alles auswählen

DeclareModule test
  Declare GetBla()
EndDeclareModule
...
War nicht nötig. Hab's ja schon bestätigt.
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.
Ja, ich weiß das auch nicht so genau. Ich habe das vom Threadstarter eben so verstanden, dass er gerne Module fast wie DLLs dynamisch laden und entladen kann. Ich denke er möchte sowas ähnliches machen wie es mit OOP möglich wäre. Man hat eine abstrakte Klasse "Plugin" und dann mehrere Klassen "Plugin1" bis "PluginX", die von dieser erben und sie erweitern. Dann kann man dynamisch Objekte von einem beliebigen Plugin erstellen, sie aber dem Typ "Plugin" zuordnen.
Aber stimmt schon. Module sind dafür eben nur begrenzt nutzbar, weil sie eben statisch sind.
Ich hab trotzdem versucht SBond irgendwie eine Möglichkeit für seinen Ansatz zu geben. Möglicherweise muss er aber auch nochmal komplett umdenken bei dem, was er vorhat.

Re: dynamischer Aufruf von Modulen

Verfasst: 07.02.2014 14:53
von helpy
Hier mal ein Code zum Testen:

Code: Alles auswählen

EnableExplicit


DeclareModule modTools
  EnableExplicit
  
  Declare AddInitProcedure( *InitProcedure, ModuleName.s )
  Declare CallInitProcedures()
  
  Macro SetInitProcedure()
    If Defined( Init, #PB_Procedure )
      modTools::AddInitProcedure( @Init(), #PB_Compiler_Module )
    EndIf
  EndMacro
EndDeclareModule

Module modTools
  Prototype pInitProcedure()
  Structure tInitProcedure
    ModuleName.s
    *InitProcedure.pInitProcedure
  EndStructure
  
  Global NewList InitProcedures.tInitProcedure()
  
  Procedure AddInitProcedure( *InitProcedure, ModuleName.s )
    If *InitProcedure
      LastElement( InitProcedures() )
      AddElement( InitProcedures() )
      With InitProcedures()
        \InitProcedure = *InitProcedure
        \ModuleName = ModuleName
      EndWith
    EndIf
  EndProcedure
  
  Procedure CallInitProcedures()
    Protected result
    ForEach  InitProcedures()
      Debug "Call InitProcedure in module " + InitProcedures()\ModuleName
      result = InitProcedures()\InitProcedure()
      Debug "  --> Result: " + Str(result)
    Next
  EndProcedure
EndModule


DeclareModule  mod1
  EnableExplicit
EndDeclareModule

Module mod1
  Procedure Init()
    Debug "Start of " + #PB_Compiler_Module + "::" + #PB_Compiler_Procedure
    ProcedureReturn 10
  EndProcedure
  modTools::SetInitProcedure()
EndModule


DeclareModule  mod2
  EnableExplicit
EndDeclareModule

Module mod2
  Procedure Init()
    Debug "Start of " + #PB_Compiler_Module + "::" + #PB_Compiler_Procedure
    ProcedureReturn 20
  EndProcedure
  modTools::SetInitProcedure()
EndModule


DeclareModule  mod3
  EnableExplicit
EndDeclareModule

Module mod3
  Procedure Init()
    Debug "Start of " + #PB_Compiler_Module + "::" + #PB_Compiler_Procedure
    ProcedureReturn 30
  EndProcedure
  modTools::SetInitProcedure()
EndModule


modTools::CallInitProcedures()

Re: dynamischer Aufruf von Modulen

Verfasst: 07.02.2014 17:05
von SBond
...da wird ja doch recht komplex.

Hintergrund für mein Beispiel mit den Plugins, ist die eigentlich der Wunsch nach Quellcode-Optimierung :D
Ich stehe immer wieder vor dem Problem größere Projekte sauber zu strukturieren. Die Module habe ich erst vor kurzem bewusst wahr genommen.
Sie bieten eine gute Möglichkeit Prozeduren und Variablen zu kapseln. Daher kam mir der Gedanke, ob man das auch dynamisch umsetzen kann.
NicTheQuick hat schon richtig erkannt, wie ich es gemeint habe :).

...aber eventuell ist das ja wirklich zu weit hergeholt, als dass es einen praktischen Sinn erfüllt.

Re: dynamischer Aufruf von Modulen

Verfasst: 07.02.2014 17:16
von ts-soft
Bei Modulen gilt das Motto: Ganz oder garnicht :mrgreen:
Das einzig geeignete wären UserLibraries, solange Du diese selbst erstelltst, sollten die ja auch kein
Problem darstellen.

UserLibraries werden nur hinzugelinkt, wenn verwendet und dann auch nur die erforderlichen Funktionen.
Die anderen Vorteile der Module wie Kapselung usw. stehen Dir dann auch zur Verfügung.

Einen anderen Weg sehe ich zur Zeit nicht.

Gruß
Thomas