Seit einigen Jahren wünschen sich die Anwender immer wieder eine Pluginschnittstelle im SpeedCommander. Bisher hatte ich mich immer etwas dagegen gesperrt, weil ich vom Pluginkonzept anderer Anwendungen nicht ganz überzeugt war. Ein Plugin muss sich in die Anwendung integrieren können, es muss Befehle zur Verfügung stellen und es muss auch die Möglichkeit bestehen, diese Befehle aus Menüs und Symbolleisten aufzurufen. Die Konfiguration sollte möglichst einfach gehalten werden und nicht über viele Dialoge verstreut sein.
Nach vielen Überlegungen bin ich auf das AddIn-Konzept von Microsoft gestoßen, das unter anderem in den Office-Produkten und in Visual Studio eingesetzt wird. Diese AddIns können mit jeder Sprache entwickelt werden, mit der sich COM-Objekte erzeugen lassen. Dies ist ein großer Vorteil gegenüber dem klassischen Dll-Konzept mit einem Satz von exportierten Funktionen, da sich auch mit Visual Basic und dem .NET-Framework COM-Objekte programmieren lassen. Beim klassischen Dll-Konzept bleiben Visual Basic und .NET nämlich außen vor.
Ein AddIn ist ein COM-Objekt und bietet verschiedene Schnittstellen an. Zwingend erforderlich ist lediglich die Schnittstelle IDTExtensibility2, welche aus fünf Methoden besteht:
- OnConnection
- OnStartupComplete
- OnBeginShutdown
- OnDisconnection
- OnAddInsUpdate
OnConnection wird aufgerufen, wenn das AddIn geladen wird. Das AddIn erhält jeweils einen Zeiger auf das Application-Interface von SpeedCommander und auf das Interface des AddIn-Objektes. Dazu bekommt es noch die Information, wie das AddIn geladen wurde. Dies kann einerseits gleich beim Starten von SpeedCommander geschehen oder später durch nachträgliche Installation oder Aktivierung des AddIns. Über das Application-Interface kann das AddIn später auf das umfangreiche Objektmodell von SpeedCommander zugreifen und z.B. neue Befehle oder eigene Symbolleisten erzeugen.
Wenn SpeedCommander komplett initialisiert wurde, wird bei allen geladenen AddIns die Methode OnStartupComplete aufgerufen. Hier kann das AddIn Funktionen aufrufen, die bei der Initialisierung eine Interaktion mit dem Benutzer erfordern. OnBeginShutdown wird aufgerufen, bevor SpeedCommander beendet wird. Das AddIn kann an dieser Stelle z.B. seine Einstellungen speichern.
Bevor das AddIn entladen wird, ruft SpeedCommander die Methode OnDisconnection auf. Dem AddIn wird hier auch der Grund des Entladens mitgeteilt. Das AddIn kann somit erkennen, ob es z.B. vom Anwender deinstalliert wurde und somit seine Einstellungsdaten löschen kann.
Die fünfte Methode OnAddInsUpdate wird aufgerufen, wenn ein anderes AddIn geladen wird. Wenn z.B. die AddIns A und B bereits geladen sind und später das AddIn C geladen wird, dann ruft SpeedCommander die Methode OnAddInsUpdate von AddIn A und B auf. Ist z.B. ein AddIn abhängig von einem anderen, so kann das AddIn hier prüfen, ob das andere AddIn geladen oder entladen wird.
