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