Wie Plugins vorbereiten

Für allgemeine Fragen zur Programmierung mit PureBasic.
Baba_Smurf
Beiträge: 55
Registriert: 01.03.2015 12:05
Wohnort: Saarland / Püttlingen
Kontaktdaten:

Wie Plugins vorbereiten

Beitrag von Baba_Smurf »

Hallo,

zu allererst einmal bin ich nach langer Zeit wieder zurück, mein Projekt an dem ich gearbeitet habe,
ist mir leider abhanden gekommen, trotz Sicherungskopie, die leider nicht mehr funktioniert.
Also fange ich nochmal von ganz vorne an, und muß mich komplett neu einlesen.
Lange Rede kurzer Sinn, ich wollte gegenüber dem vorherigen Programm einige Änderungen machen und genau das führt mich zu dieser Frage.

Wie baut man ein Programm modular auf ?? D.h wie macht man es so, das Mann/Frau später noch Plugins einbauen kann??

Mein gedanklicher Ansatz wäre, ich prüfe ob ein Plugin-Verzeichniis vorhanden ist, wenn ja, soll es z.b in der Toolbar mit auftauchen.
Funktioniert dieser Ansatz?? oder gibt es eine koplett andere/besser Lösung??

mfg
Benutzeravatar
Sicro
Beiträge: 968
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Wie Plugins vorbereiten

Beitrag von Sicro »

Ich denke, der Beispiel-Code ist selbsterklärend. Sollte etwas unklar sein, einfach fragen.

Hauptprogramm (erwartet die Plugins im Plugins-Verzeichnis des Programm-Verzeichnisses):

Code: Alles auswählen

UsePNGImageDecoder()

Structure PluginDataStruc
  Name.s
  *ToolBarImage
  *ToolBarButtonClickFunction
EndStructure

Structure PluginStruc Extends PluginDataStruc
  Library.i
EndStructure

Define.PluginStruc *PluginData
Define             PluginsCounter
Define             Library
Define.PluginStruc NewMap Plugins()
Define.s           PluginsDirectoryPath

PluginsDirectoryPath = GetPathPart(ProgramFilename()) + "Plugins\"

If Not OpenWindow(0, #PB_Ignore, #PB_Ignore, 300, 300, "MainWindow", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  Debug "OpenWindow: Error"
  End
EndIf

If Not CreateToolBar(0, WindowID(0))
  CloseWindow(0)
  Debug "CreateToolBar: Error"
  End
EndIf

; Alle DLL-Dateien im Plugin-Verzeichnis durchgehen
If ExamineDirectory(0, PluginsDirectoryPath, "*.dll")
  While NextDirectoryEntry(0)
    If DirectoryEntryType(0) = #PB_DirectoryEntry_File
      
      ; Library öffnen und in das Programm integrieren
      Library = OpenLibrary(#PB_Any, PluginsDirectoryPath + DirectoryEntryName(0))
      If Library
        If AddMapElement(Plugins(), Str(PluginsCounter))
          Plugins()\Library = Library
          *PluginData = CallFunction(Library, "GetPluginInfo")
          CopyMemory(*PluginData, @Plugins(), SizeOf(PluginDataStruc))
          Debug "Plugin-Name: " + Plugins()\Name
          Plugins()\ToolBarImage = CatchImage(#PB_Any, *PluginData\ToolBarImage)
          ToolBarImageButton(PluginsCounter, ImageID(Plugins()\ToolBarImage))
          ;BindEvent(#PB_Event_Menu, Plugins()\ToolBarButtonClickFunction, 0, PluginsCounter)
          PluginsCounter + 1
        Else
          CloseLibrary(Library)
        EndIf
      EndIf
      
    EndIf
  Wend
  FinishDirectory(0)
EndIf

Repeat
  Event = WaitWindowEvent()
  If Event = #PB_Event_Menu
    CallFunctionFast(Plugins(Str(EventMenu()))\ToolBarButtonClickFunction)
  EndIf
Until Event = #PB_Event_CloseWindow

; Aufräumen
ForEach Plugins()
  FreeImage(Plugins()\ToolBarImage)
  CallFunction(Plugins()\Library, "UnloadPlugin")
  CloseLibrary(Plugins()\Library)
Next
Edit: BindEvent-Code korrigiert. BindMenuEvent funktioniert mit ToolBars merkwürdigerweise nicht.

Plugin (zu einer DLL kompilieren):

Code: Alles auswählen

Structure PluginDataStruc
  Name.s
  *ToolBarImage
  *ToolBarButtonClickFunction
EndStructure

Global.PluginDataStruc *PluginMemory

Procedure ToolBarButtonClickFunction()
  MessageRequester("Nachricht von Plugin", "ToolBarButton wurde gedrückt!")
EndProcedure

ProcedureDLL GetPluginInfo()
  
  If *PluginMemory = 0
    *PluginMemory = AllocateMemory(SizeOf(PluginDataStruc))
    *PluginMemory\Name                       = "Cooles Plugin"
    *PluginMemory\ToolBarImage               = ?Icon
    *PluginMemory\ToolBarButtonClickFunction = @ToolBarButtonClickFunction()
  EndIf
  
  ProcedureReturn *PluginMemory
  
EndProcedure

ProcedureDLL UnloadPlugin()
  FreeMemory(*PluginMemory)
EndProcedure

DataSection
  Icon:
  IncludeBinary #PB_Compiler_Home + "examples/sources/Data/ToolBar/Save.png"
EndDataSection
Zuletzt geändert von Sicro am 23.07.2016 12:05, insgesamt 2-mal geändert.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Baba_Smurf
Beiträge: 55
Registriert: 01.03.2015 12:05
Wohnort: Saarland / Püttlingen
Kontaktdaten:

Re: Wie Plugins vorbereiten

Beitrag von Baba_Smurf »

Hallo,

vielen Dank.....so in etwa waren meine Gedankengänge auch.
Danke nochmals für den Code.

mfg
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Wie Plugins vorbereiten

Beitrag von man-in-black »

Hi,

ich weiß zwar nicht, wie umfangreich deine Plugins werden und was sie alles können sollen,
aber nur mal zwei Gedanken:

-du kannst deine Plugins mit mehreren "Startoptionen" versehen.
Prodeduren, die beim Programmstart, über das Menüband, beim Beenden, ... aufgerufen werden
(Also im Grunde so, wie auch eine DLL geladen/ausgeführt wird^^)

-kleine Skriptsprache neben der DLL, die deine GUI manipulieren kann? (zusätzliche Buttons, vorhandene verändern, ...)
Man kann die GUI sicherlich auch über die DLL anpassen, aber da weiß ich im Moment nicht,
wie "einfach" und plattformunabhängig das wird

MFG
MIB
(hab alles, kann alles, weiß alles!!^^)

Bild
Antworten