Kommandozeile per DLL

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

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\root\Office16\MSACCESS.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 = ""
         strWorkingDirectory = ""
         pProcess.StartInfo.FileName = strCommand
         pProcess.StartInfo.Arguments = strCommandParameters
         pProcess.StartInfo.UseShellExecute = False
         pProcess.StartInfo.RedirectStandardOutput = True
         pProcess.StartInfo.WorkingDirectory = strWorkingDirectory
         pProcess.Start()
         Dim strOutput As String = pProcess.StandardOutput.ReadToEnd()
         pProcess.WaitForExit()
         Return strOutput
     End Function
End Class

Listing 1: Die Klasse mit der Schnittstelle und der Funktion PDFTK

Der erste Teil ist das Interface, das wir anlegen müssen, damit wir nur unsere eigenen Member in der DLL angezeigt bekommen (siehe auch unter VB.NET-DLL für Access programmieren). Die eigentliche Klasse namens CMD implementiert die einzige Funktion der Schnittstelle ICMD namens PDFTK. Diese Funktion soll einen Wert mit dem Datentyp String zurückliefern. Sie erstellt ein neues Objekt des Typs Process und weist dem Objekt StartInfo dieses Objekts verschiedene Daten zu – zum Beispiel den Namen der aufzurufenden Datei PDFtk.exe mit der Eigenschaft FileName. Andere Parameter wie Arguments oder WorkingDirectory verwenden wir in dieser Version noch nicht. Allerdings stellen wir die Eigenschaft RedirectStandardOutput auf True ein.

Der Start des Aufrufs erfolgt dann mit der Start-Methode. Den Output des Prozesses ermitteln wir mit der Methode ReadToEnd des Objekts Standardoutput des Prozesses und schreiben diesen in die Variable strOutput. Nachdem wir das Ende mit der Methode WaitForExit abgewartet haben, können wir den Inhalt von strOutput als Rückgabewert zurück an die aufrufende Instanz liefern.

Wenn wir nun das Debuggen dieses Projekts starten, müssen Sie gegebenenfalls noch einen Verweis im VBA-Editor auf die Bibliothek CMDResponse hinzufügen (wie in VB.NET-DLL für Access programmieren beschrieben).

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

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar