twinBASIC – COM-Add-Ins für Access

Neben COM-DLLs können Sie mit twinBASIC auch COM-Add-Ins programmieren, deren Funktionen dann in der Benutzeroberfläche von Access angezeigt und genutzt werden können. Die Möglichkeiten sind unbegrenzt – Sie können damit beispielsweise Ribbon-Einträge hinzufügen, die dauerhaft und unabhängig von der jeweils geöffneten Datenbank verfügbar sind und damit selbst programmierte Funktionen aufrufen. Welche Funktionen sinnvoll sind und sich hier umsetzen lassen, schauen wir uns in weiteren Beiträgen an. Dieser Beitrag beleuchtet zunächst einmal die technischen Grundlagen für die Erstellung von COM-Add-Ins für die Access-Benutzeroberfläche.

COM-Add-Ins und Access-Add-Ins

Bevor wir in die Materie einsteigen, wollen wir den Unterschied zwischen COM-Add-Ins und Access-Add-Ins klären. Access-Add-Ins sind Access-Datenbanken, die eine spezielle Dateiendung enthalten und eine Tabelle namens USysRegInfo mit Einträgen, welche Informationen über das Add-In zum Eintragen in die Registry enthalten.

Diese rufen Sie schließlich über den Ribbon-Eintrag Datenbanktools|Add-Ins|Add-Ins auf. Bild 1 zeigt einige Add-Ins in der Access-Installation des Autors dieses Beitrags. Ein Klick auf einen dieser Einträge startet diesen und zeigt beispielsweise ein Formular mit den enthaltenen Funktionen an. Es gibt noch weitere Möglichkeiten, Access-Add-Ins zu platzieren – zum Beispiel als Steuerelement-Assistent oder Formular-Assistent.

Access-Add-Ins

Bild 1: Access-Add-Ins

Der wichtigste Unterschied zwischen Access-Add-Ins und den hier vorgestellten COM-Add-Ins für Access ist, dass Sie für COM-Add-Ins keine speziellen Orte vorfinden, an denen Sie deren Aufruf platzieren können. Stattdessen fügen Sie einfach im gewünschten Ribbon einen Eintrag hinzu oder auch ein eigenes Ribbon, über das Sie das COM-Add-In starten können. Der zweite wichtige Unterschied ist, dass Sie Access-Add-Ins komplett mit Access erstellen. Sie brauchen dann nur die Dateiendung von .accdb auf .accda zu ändern und die bereits erwähnte Tabelle namens USysRegInfo mit Informationen über die Art des Access-Add-Ins, den Namen et cetera sowie die auszuführende Funktion hinzuzufügen.

Ein COM-Add-In hingegen können Sie nicht einfach mit Access erstellen, sondern Sie benötigen dazu eine externe Entwicklungsumgebung. Früher hat man das mit Visual Studio 6 erledigt. Auch der Nachfolger Visual Studio .NET hat im Laufe der Zeit verschiedene Tools zum Erstellen von Office-Add-Ins angeboten.

Für die Erstellung von Access-Add-Ins musste man jedoch unter Visual Studio .NET immer improvisieren: Vorlagen gab es nämlich nur für die populäreren Office-Anwendungen wie Word, Outlook oder Excel.

Kein 64-Bit unter Visual Studio 6

Der Nachteil bei der COM-Add-In-Entwicklung unter Visual Studio 6 zeigt sich aktuell zunehmend darin, dass immer mehr Installationen von Office beziehungsweise Access die 64-Bit-Version verwenden. Und Visual Studio 6 erstellt nur Projekte in der 32-Bit-Version. Insofern sind mit twinBASIC erstellte COM-Add-Ins auch zukunftssicherer.

COM-Add-Ins mit twinBASIC

Im April 2021 hat jedoch Wayne Philips, der bereits mit dem Fehler- und Debugging-Tool vbWatchdog von sich hören machte, eine erste Version seiner Entwicklungsumgebung für VB- und VBA-kompatible Projekte veröffentlicht. Diese basiert auf Visual Studio Code und nutzt eine eigene Erweiterung für das Programmieren von VB- und VBA-Projekten.

In Kürze soll man damit auch Anwendungen mit Benutzeroberfläche damit programmieren können, derzeit ist das aber noch nicht möglich. Für uns spielt das keine Rolle – wir schauen uns erst einmal die grundlegenden Möglichkeiten der Erstellung von COM-Add-Ins für die Access-Benutzeroberfläche an.

Die Grundlagen zum Einrichten von Visual Studio Code und der für die VB-Programmierung benötigten Erweiterung haben wir bereits im Beitrag twinBASIC – VB/VBA mit moderner Umgebung (www.access-im-unternehmen.de/1303) beschrieben. Im vorliegenden Beitrag bauen wir auf einem einfachen Template für ein Access-COM-Add-In auf und erläutern die einzelnen Bestandteile. Anschließend fügen wir dem COM-Add-In einige Beispielfunktionen hinzu.

Wir starten mit einem Beispielprojekt, das Sie per Doppelklick auf die Datei myAccessAddIn.code-workspace starten. Dies öffnet das Projekt im twinBASIC-Editor beziehungsweise in Visual Studio Code wie in Bild 2.

Aufbau eines Projekts für die Erstellung eines COM-Add-Ins

Bild 2: Aufbau eines Projekts für die Erstellung eines COM-Add-Ins

Die hier sichtbaren Prozeduren sind die Implementierung einer Schnittstelle namens IDExtensibility2, die bereits seit VB6 zum Implementieren der Funktionen für COM-Add-Ins für die verschiedenen Office-Anwendungen und auch für den VBA-Editor verwendet wird (siehe Listing 1).

Class MyAccessAddin
     Implements IDTExtensibility2
     Implements IRibbonExtensibility
  
     Private _Access As Object ''VBIDE.VBE
     Private _AddIn As Object ''VBIDE.AddIn
    
     Sub OnConnection(ByVal Application As Object, ByVal ConnectMode As ext_ConnectMode, _
             ByVal AddInInst As Object, ByRef custom As Variant()) _
             Implements IDTExtensibility2.OnConnection
         MsgBox "myAccessAddin.OnConnection"
         Set _Access = Application
         Set _AddIn = AddInInst
     End Sub
     
     Sub OnDisconnection(ByVal RemoveMode As ext_DisconnectMode, ByRef custom As Variant()) _
             Implements IDTExtensibility2.OnDisconnection
         MsgBox "myAccessAddin.OnDisconnection"
     End SUb
     
     Sub OnAddInsUpdate(ByRef custom As Variant()) _
             Implements IDTExtensibility2.OnAddInsUpdate
         MsgBox "myAccessAddin.OnAddInsUpdate"
     End Sub
     
     Sub OnStartupComplete(ByRef custom As Variant()) _
             Implements IDTExtensibility2.OnStartupComplete
         MsgBox "myAccessAddin.OnStartupComplete"
     End Sub
     
     Sub OnBeginShutdown(ByRef custom As Variant())_
             Implements IDTExtensibility2.OnBeginShutdown
         MsgBox "myAccessAddin.OnBeginShutdown"
     End Sub
End Class

Listing 1: Implementierung der Schnittstelle für COM-Add-Ins

Um diese in der Klasse unseres twinBASIC-Projekts zu implementieren, fügen wir dem Modul HelloWorld.twin die folgende Zeile hinzu:

Implements IDTExtensibility2

Diese Schnittstelle ist in der Bibliothek Microsoft Add-In Designer definiert, die genau wie die Implementierung der Schnittstelle bereits im Beispielprojekt enthalten ist. Die Verweise auf Bibliotheken finden Sie übrigens im Bereich Settings unter COM Type Library / ActiveX References (siehe Bild 3).

Notwendige Verweise für ein Access-Add-In

Bild 3: Notwendige Verweise für ein Access-Add-In

Hier haben wir auch gleich noch die Bibliothek Microsoft Office 16.0 Object Library hinzugefügt, denn wir wollen später auch noch ein Ribbon zum Aufrufen der Befehle des COM-Add-Ins zum Projekt hinzufügen. Diesen Verweis finden Sie schnell in der Liste, wenn Sie im Suchen-Feld Teile des Verweisnamens eingeben, beispielsweise Office.

Diese Schnittstelle enthält einige Ereignisprozeduren, die zu verschiedenen Gelegenheiten ausgelöst werden. Das Besondere an einer Schnittstelle ist, dass Sie alle dafür definierten Ereignisse implementieren müssen – auch wenn diese gar keine Befehle enthalten und somit nichts tun.

Die wichtigste Ereignisprozedur für diese Implementierung für uns ist in der Regel die Methode OnConnection. Diese wird aufgerufen, wenn Access startet und nachdem es im entsprechenden Registry-Zweig nachgesehen hat, ob irgendwelche COM-Add-Ins geladen werden müssen – dazu später mehr.

Diese Ereignisprozedur stellt zwei wichtige Parameter zur Verfügung:

  • Application: Liefert einen Verweis auf das Application-Objekt der Anwendung, die das COM-Add-In aufruft.
  • AddInInst: Liefert einen Verweis auf das AddIn-Objekt.

Mit dem Verweis auf das Application-Objekt der Anwendung können Sie dann vom Code des COM-Add-Ins aus auf die Anwendung selbst zugreifen. Um diesen Verweis während der Verwendung des COM-Add-Ins ständig im Zugriff zu haben, speichern wir es in einer Variablen, die wir wir folgt deklarieren:

Private _Access As Access.Application

Sie ahnen es bereits: Wenn wir Elemente der Access-Bibliothek verwenden, benötigen wir auch noch einen Verweis auf die Bibliothek Microsoft Access 16.0 Object Library. Diesen fügen Sie noch über den oben bereits erwähnten Bereich COM Type Library / ActiveX References hinzu.

Wichtig: Damit die enthaltenen Elemente auch im Code zur Verfügung stehen, müssen Sie die geänderten Einstellungen einmal speichern.

Das gelingt am einfachsten, wenn Sie noch während der Anzeige des Einstellungen-Bereichs die Tastenkombination Strg + S betätigen. Den mit dem Parameter AddInInst gelieferten Verweis speichern wir in der folgenden Variablen:

Private _AddIn As COMAddIn

Damit die beiden Parameter auch in diesen Variablen landen, fügen wir neben einer Meldungsanweisung die folgenden beiden Zeilen in die Ereignisprozedur OnConnection ein:

Sub OnConnection(ByVal Application As Object, _
         ByVal ConnectMode As ext_ConnectMode, _
         ByVal AddInInst As Object, _
         ByRef custom As Variant()) _
         Implements IDTExtensibility2.OnConnection
     MsgBox "myAccessAddin.OnConnection"
     Set _Access = Application
     Set _AddIn = AddInInst
End Sub

Mit der Meldung prüfen wir, ob das COM-Add-In überhaupt geladen wird.

Erstellen des COM-Add-Ins

Wenn Sie die Build-Schaltfläche in der twinBASIC-Erweiterung von Visual Studio Code verwenden, erstellt dies nicht nur die DLL-Datei mit dem COM-Add-In, sondern es werden bereits die grundlegenden Registrierungseinträge vorgenommen. Das sind die Einträge, die auch für die Registrierung einer einfachen COM-DLL notwendig sind.

Ob das COM-Add-In erfolgreich erstellt wurde, entnehmen Sie dem Bereich Debugging-Console von Visual Studio Code (siehe Bild 4).

Ausgabe beim erfolgreichen Erstellen des COM-Add-Ins

Bild 4: Ausgabe beim erfolgreichen Erstellen des COM-Add-Ins

Registrierung des COM-Add-Ins

Für ein COM-Add-In sind aber noch ein paar weitere Einträge notwendig, die Sie aktuell noch manuell hinzufügen müssen. Wobei manuell bedeutet, dass Sie eine Registrierungsdatei aufrufen müssen, die dann die einzelnen Schritte für Sie erledigt.

Dazu legen Sie eine Textdatei mit der Dateiendnung .reg an, der Sie den Inhalt aus Listing 2 hinzufügen. Nachdem Sie diese Datei erstellt und gespeichert haben, rufen Sie diese per Doppelklick auf.

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\Access\Addins\MyAccessAddIn.MyAccessAddin]
"FriendlyName"="MyAccessAddin (friendly name)"
"Description"="MyAccessAddin (description)"
"LoadBehavior"=dword:00000003

Listing 2: Registrierungseintrag für das COM-Add-In

Anschließend können Sie in der Registrierung von Windows prüfen, ob alle benötigten Einträge vorgenommen wurden. Den Registrierungseditor öffnen Sie durch Eingabe von regedit in das Suchen-Fenster von Windows und das anschließende Aufrufen der Anwendung Registrierungs-Editor.

Hier navigieren Sie zum Zweig HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\Access\Addins\MyAccess-AddIn, der wie in Bild 5 aussehen sollte.

Einträge für das COM-Add-In in die Windows-Registrierung

Bild 5: Einträge für das COM-Add-In in die Windows-Registrierung

Erster Start des COM-Add-Ins

Damit können wir das COM-Add-In erstmalig testen. Hier noch einmal die Voraussetzungen:

  • Zusätzliche Verweise auf Microsoft Office 16.0 Object Library und Microsoft Access 16.0 Office Library hinzugefügt und Einstellungen anschließend gespeichert
  • Code des Beispiel-COM-Add-Ins wie beschrieben angepasst
  • Build-Schaltfläche gedrückt und somit das COM-Add-In erstellt
  • Registrierungsdatei ausgeführt

Ob das COM-Add-In erstellt wurde, können Sie im Ordner Build des Projektordners prüfen – hier sollten Sie eine neu erstellte .dll-Datei vorfinden.

Wenn Sie danach Access starten, sollte eine MsgBox erscheinen, die den Text myAccessAddin.OnConnection anzeigt. Damit haben wir die Basis für ein Access-Add-In gelegt.

Ribbon-Eintrag zum Steuern der Funktionen hinzufügen

Wenn Sie die Funktionen des COM-Add-Ins aufrufen wollen, gibt es unter Access keine andere Möglichkeit als einen Ribbon-Befehl.

Diesen müssen wir allerdings erst einmal hinzufügen. Dazu gibt es eine weitere Schnittstelle, die wir normalerweise wie folgt zur Klasse unseres Projekts hinzufügen:

Implements IRibbonExtensibility

Es gibt jedoch eine kleine Erweiterung, die wir im Falle der Erstellung des COM-Add-Ins mit twinBASIC hinzufügen müssen. Dabei handelt es sich um die Eigenschaft WithDispatchForwarding, die Sie der Implements-Anweisung voranstellen:

[WithDispatchForwarding]
Implements IRibbonExtensibility

Der Grund ist, dass sonst kein Aufruf der Callback-Funktionen in der COM-DLL möglich ist.

Die Schnittstelle IRibbonExtensibility ist Teil der oben bereits per Verweis eingebundenen Bibliothek Microsoft Office 16.0 Object Library. Haben Sie diesen also noch nicht hinzugefügt, ist jetzt ein geeigneter Zeitpunkt dafür gekommen (Speichern der Einstellungen anschließend nicht vergessen).

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar