Der Thread Externe Anwendung Schließen hat mich heute darauf gebracht, dass es wirklich keine vernünftige Methode gibt, um in VBA mit externen Programmen zu arbeiten (Shell() kann nur öffnen, schließen sieht da schon wieder anders aus).
Darum habe ich einen kleinen Wrapper für COM erstellt.
Spoiler anzeigen
Der Wrapper umfasst zwar nicht alle Funktionen der Process-Klasse, aber es sollte reichen um damit zu arbeiten. Projekt mit vorkompilierter Binary befindet sich im Anhang.
COMDiagnosticsProcess.zip
Damit das Ganze in VBA sichtbar wird, muss man die DLL nur noch registrieren.
[Windows XP]:
den Ordner bin\Release öffnen und die Datei "Register.bat" ausführen.
[Windows Vista/7]:
Eingabeaufforderung von Visual Studio (2010) als Administrator öffnen
in den Ordner bin\Release wechseln
DLL mit folgendem Befehl registrieren:
Darum habe ich einen kleinen Wrapper für COM erstellt.
VB.NET-Quellcode
- <ComClass(Process.ClassId, Process.InterfaceId, Process.EventsId)> _
- <System.Runtime.InteropServices.ComVisible(True)>
- Public Class Process
- #Region "COM-GUIDs"
- ' Diese GUIDs stellen die COM-Identität für diese Klasse
- ' und ihre COM-Schnittstellen bereit. Wenn Sie sie ändern, können vorhandene
- ' Clients nicht mehr auf die Klasse zugreifen.
- Public Const ClassId As String = "35f8ff17-a69e-4d53-acbf-ea93caf87f98"
- Public Const InterfaceId As String = "af9ff5d0-2b4f-4a19-8d66-32a54dbbbb62"
- Public Const EventsId As String = "7b0c6069-275d-42f5-b7d9-50a70fae01ad"
- #End Region
- ' Eine erstellbare COM-Klasse muss eine Public Sub New()
- ' ohne Parameter aufweisen. Andernfalls wird die Klasse
- ' nicht in der COM-Registrierung registriert und kann nicht
- ' über CreateObject erstellt werden.
- Public Sub New()
- MyBase.New()
- _p = New System.Diagnostics.Process
- End Sub
- Public Sub Start()
- _p.Start()
- End Sub
- Public Sub StartWait()
- _p.Start()
- _p.WaitForExit()
- End Sub
- Public Sub Kill()
- _p.Kill()
- End Sub
- Public Sub GetProcessByName(ByVal Name As String)
- _p = Diagnostics.Process.GetProcessesByName(Name)(0)
- End Sub
- Public Sub GetProcessByID(ByVal ID As Integer)
- _p = Diagnostics.Process.GetProcessById(ID)
- End Sub
- Private _p As System.Diagnostics.Process
- Public Property FileName As String
- Get
- Return _p.StartInfo.FileName
- End Get
- Set(value As String)
- _p.StartInfo.FileName = value
- End Set
- End Property
- Public Property WorkingDirectory As String
- Get
- Return _p.StartInfo.WorkingDirectory
- End Get
- Set(value As String)
- _p.StartInfo.WorkingDirectory = value
- End Set
- End Property
- Public ReadOnly Property ExitCode As Integer
- Get
- Return _p.ExitCode
- End Get
- End Property
- Public Property Arguments As String
- Get
- Return _p.StartInfo.Arguments
- End Get
- Set(value As String)
- _p.StartInfo.Arguments = value
- End Set
- End Property
- Public Property CreateNoWindow As Boolean
- Get
- Return _p.StartInfo.CreateNoWindow
- End Get
- Set(value As Boolean)
- _p.StartInfo.CreateNoWindow = value
- End Set
- End Property
- Public Property UseShellExecute As Boolean
- Get
- Return _p.StartInfo.UseShellExecute
- End Get
- Set(value As Boolean)
- _p.StartInfo.UseShellExecute = value
- End Set
- End Property
- Public Property WindowStyle As COMProcessWindowStyle
- Get
- Return _p.StartInfo.WindowStyle
- End Get
- Set(value As COMProcessWindowStyle)
- _p.StartInfo.WindowStyle = value
- End Set
- End Property
- Public ReadOnly Property HasExited As Boolean
- Get
- Return _p.HasExited
- End Get
- End Property
- Public ReadOnly Property ID As Integer
- Get
- Return _p.Id
- End Get
- End Property
- Public ReadOnly Property Handle As Integer
- Get
- Return _p.Handle.ToInt32
- End Get
- End Property
- <System.Runtime.InteropServices.ComVisible(True)>
- Public Enum COMProcessWindowStyle As Integer
- Normal = 0
- Hidden = 1
- Minimized = 2
- Maximized = 3
- End Enum
- End Class
Der Wrapper umfasst zwar nicht alle Funktionen der Process-Klasse, aber es sollte reichen um damit zu arbeiten. Projekt mit vorkompilierter Binary befindet sich im Anhang.
COMDiagnosticsProcess.zip
Damit das Ganze in VBA sichtbar wird, muss man die DLL nur noch registrieren.
[Windows XP]:
den Ordner bin\Release öffnen und die Datei "Register.bat" ausführen.
[Windows Vista/7]:
Eingabeaufforderung von Visual Studio (2010) als Administrator öffnen
in den Ordner bin\Release wechseln
DLL mit folgendem Befehl registrieren:
SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=
Weil einfach, einfach zu einfach ist!
Weil einfach, einfach zu einfach ist!