Kommandozeile per DLL

Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

Kommandozeile per DLL

Wenn Sie von Access aus Befehle ausführen wollen, die Sie normalerweise über die Kommandozeile beziehungsweise die Eingabeaufforderung eingeben würden, ist das kein Problem – das erledigen Sie ganz einfach über die Shell-Anweisung. Interessanter wird es, wenn Sie die Ausgabe der Anwendung einlesen und verarbeiten wollen, um beispielsweise auszuwerten, ob der Aufruf erfolgreich war oder welches Ergebnis dieser geliefert hat. Mit VBA beziehungsweise API-Funktionen gelingt dies nicht immer zuverlässig. Also schauen wir uns in der .NET-Bibliothek um, ob es dort Alternativen gibt, und machen uns diese über eine DLL unter VBA verfügbar.

Im Beitrag VB.NET-DLL für Access programmieren (www.access-im-unternehmen.de/1167) haben wir gezeigt, wie Sie eine VB-DLL programmieren, die Sie vom VBA-Projekt einer Access-Anwendung aus einbinden können, um auf ihre Methoden und Eigenschaften zuzugreifen. Auf dieser DLL setzen wir nun auf, um uns die zum Absetzen von Programmaufrufen und zum Erfassen der Rückgabewerte erforderlichen Funktionen verfügbar zu machen.

Debugging

Um das Debugging zu erleichtern, wollen wir während des Aufrufs von Access aus den Code der COM-DLL debuggen. Dazu sind ein paar kleine Einstellungen nötig, die wir in den Projekteigenschaften im Bereich Debuggen vornehmen. Hier stellen wir für die Eigenschaft Externes Programm starten den Pfad zur MSAccess.exe ein (siehe Bild 1). Dieser Pfad lautet beispielsweise unter Office 365 wie folgt:

Pfad zur MSAccess.exe festlegen, die beim Debuggen gestartet werden soll

Bild 1: Pfad zur MSAccess.exe festlegen, die beim Debuggen gestartet werden soll

C:Program Files (x86)Microsoft Office
ootOffice16MSACCESS.EXE

Unter Befehlszeilenargument geben Sie den Pfad zu der zu verwendenden Datenbankdatei ein.

Wenn Sie beim Starten nun noch wollen, dass das VBA-Modul mit den Anweisungen zum Testen der DLL aufgerufen wird, fügen Sie der Datenbank ein einfaches Formular hinzu, für dessen Ereigniseigenschaft Beim Laden Sie die folgende Ereignisprozedur hinterlegen:

Private Sub Form_Load()
     DoCmd.OpenModule "mdlDLL"
End Sub

Speichern Sie das Formular unter dem Namen frmStart. Hinterlegen Sie dieses Formular in den Access-Optionen für die Eigenschaft Formular anzeigen (siehe Bild 2).

Einstellen des Startformulars unserer Beispielanwendung

Bild 2: Einstellen des Startformulars unserer Beispielanwendung

Wenn Sie die .NET-DLL nun von Visual Studio aus mit dem Menübefehl Debugging|Debugging starten, wird direkt die angegebene Access-Datenbank geöffnet. Diese zeigt direkt das Formular frmStart an, welches wiederum den VBA-Editor mit dem Modul mdlDLL anzeigt.

Test mit PDFTK

Im Beitrag PDF-Dokumente im Griff mit PDFtk (www.access-im-unternehmen.de/1166) zeigen wir, wie Sie mit dem Kommandozeilentool PDFtk auf PDF-Dokumente zugreifen, um diese zu kombinieren, zu schützen und vieles mehr. Dies gelingt allerdings nur über die Eingabeaufforderung. Wir können die notwendigen Befehle zwar über die Shell-Anweisung absetzen, allerdings können wir die Rückgabewerte beziehungsweise die Ausgabe von PDFtk.exe nicht einlesen oder auswerten.

Das wollen wir nun mit den unter .NET viel flexibleren Bibliotheken erledigen, in diesem Fall mit einige Elementen der Bibliothek System.Diagnostics. Um die DLL zunächst mit einer einfachen Funktion auszustatten, die PDFTK heißt und einfach nur den Befehl PDFTK absetzt und die resultierende Ausgabe abfängt und als Rückgabewert liefert, füllen Sie die Klassendatei des Projekts wie in Listing 1.

Imports System.Runtime.InteropServices
<InterfaceType(ComInterfaceType.InterfaceIsDual)>
<Guid("FE5FEE03-A893-4D02-8081-0F56CF485AAC")>
Public Interface ICMD
     Function PDFTK() As String
End Interface
<ClassInterface(ClassInterfaceType.None)>
<Guid("E8C7BD72-7751-47B0-AE2A-F8E677A0A16C")>
Public Class CMD
     Implements ICMD
     Public Function PDFTK() As String Implements ICMD.PDFTK
         Dim pProcess As System.Diagnostics.Process =  New System.Diagnostics.Process()
         Dim strCommand As String
         Dim strCommandParameters As String
         Dim strWorkingDirectory As String
         strCommand = "pdftk.exe"
         strCommandParameters = ""

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Ich habe die Datenschutzbestimmungen zur Kenntnis genommen.