Seite 1 von 1

Wie Plugins vorbereiten

Verfasst: 21.07.2016 18:21
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

Re: Wie Plugins vorbereiten

Verfasst: 22.07.2016 20:12
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

Re: Wie Plugins vorbereiten

Verfasst: 23.07.2016 07:03
von Baba_Smurf
Hallo,

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

mfg

Re: Wie Plugins vorbereiten

Verfasst: 23.07.2016 13:20
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