COM-Wrapper für die Process-Klasse

    • VB.NET

      COM-Wrapper für die Process-Klasse

      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

      VB.NET-Quellcode

      1. <ComClass(Process.ClassId, Process.InterfaceId, Process.EventsId)> _
      2. <System.Runtime.InteropServices.ComVisible(True)>
      3. Public Class Process
      4. #Region "COM-GUIDs"
      5. ' Diese GUIDs stellen die COM-Identität für diese Klasse
      6. ' und ihre COM-Schnittstellen bereit. Wenn Sie sie ändern, können vorhandene
      7. ' Clients nicht mehr auf die Klasse zugreifen.
      8. Public Const ClassId As String = "35f8ff17-a69e-4d53-acbf-ea93caf87f98"
      9. Public Const InterfaceId As String = "af9ff5d0-2b4f-4a19-8d66-32a54dbbbb62"
      10. Public Const EventsId As String = "7b0c6069-275d-42f5-b7d9-50a70fae01ad"
      11. #End Region
      12. ' Eine erstellbare COM-Klasse muss eine Public Sub New()
      13. ' ohne Parameter aufweisen. Andernfalls wird die Klasse
      14. ' nicht in der COM-Registrierung registriert und kann nicht
      15. ' über CreateObject erstellt werden.
      16. Public Sub New()
      17. MyBase.New()
      18. _p = New System.Diagnostics.Process
      19. End Sub
      20. Public Sub Start()
      21. _p.Start()
      22. End Sub
      23. Public Sub StartWait()
      24. _p.Start()
      25. _p.WaitForExit()
      26. End Sub
      27. Public Sub Kill()
      28. _p.Kill()
      29. End Sub
      30. Public Sub GetProcessByName(ByVal Name As String)
      31. _p = Diagnostics.Process.GetProcessesByName(Name)(0)
      32. End Sub
      33. Public Sub GetProcessByID(ByVal ID As Integer)
      34. _p = Diagnostics.Process.GetProcessById(ID)
      35. End Sub
      36. Private _p As System.Diagnostics.Process
      37. Public Property FileName As String
      38. Get
      39. Return _p.StartInfo.FileName
      40. End Get
      41. Set(value As String)
      42. _p.StartInfo.FileName = value
      43. End Set
      44. End Property
      45. Public Property WorkingDirectory As String
      46. Get
      47. Return _p.StartInfo.WorkingDirectory
      48. End Get
      49. Set(value As String)
      50. _p.StartInfo.WorkingDirectory = value
      51. End Set
      52. End Property
      53. Public ReadOnly Property ExitCode As Integer
      54. Get
      55. Return _p.ExitCode
      56. End Get
      57. End Property
      58. Public Property Arguments As String
      59. Get
      60. Return _p.StartInfo.Arguments
      61. End Get
      62. Set(value As String)
      63. _p.StartInfo.Arguments = value
      64. End Set
      65. End Property
      66. Public Property CreateNoWindow As Boolean
      67. Get
      68. Return _p.StartInfo.CreateNoWindow
      69. End Get
      70. Set(value As Boolean)
      71. _p.StartInfo.CreateNoWindow = value
      72. End Set
      73. End Property
      74. Public Property UseShellExecute As Boolean
      75. Get
      76. Return _p.StartInfo.UseShellExecute
      77. End Get
      78. Set(value As Boolean)
      79. _p.StartInfo.UseShellExecute = value
      80. End Set
      81. End Property
      82. Public Property WindowStyle As COMProcessWindowStyle
      83. Get
      84. Return _p.StartInfo.WindowStyle
      85. End Get
      86. Set(value As COMProcessWindowStyle)
      87. _p.StartInfo.WindowStyle = value
      88. End Set
      89. End Property
      90. Public ReadOnly Property HasExited As Boolean
      91. Get
      92. Return _p.HasExited
      93. End Get
      94. End Property
      95. Public ReadOnly Property ID As Integer
      96. Get
      97. Return _p.Id
      98. End Get
      99. End Property
      100. Public ReadOnly Property Handle As Integer
      101. Get
      102. Return _p.Handle.ToInt32
      103. End Get
      104. End Property
      105. <System.Runtime.InteropServices.ComVisible(True)>
      106. Public Enum COMProcessWindowStyle As Integer
      107. Normal = 0
      108. Hidden = 1
      109. Minimized = 2
      110. Maximized = 3
      111. End Enum
      112. 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:

      Quellcode

      1. regasm.exe COMDiagnosticsProcess.dll /tlb:COMDiagnosticsProcess.tlb /codebase
      SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

      Weil einfach, einfach zu einfach ist! :D