Feedback

VB - Excel Prozess schließen

Veröffentlicht von am 6/10/2009
(7 Bewertungen)
An diesem Problem ist schon manch einer verzweifelt:
Man hat eine Excel Application geöffnet (VB.NET oder C-Sharp), nach dem Beenden jedoch bleibt im Task Manager der Prozess immernoch Aktiv.

Eigentlich sollte eine Excel Application mit XLSApp.Close oder XLSApp.Quit mit anschließendem

System.Runtime.InteropServices.Marshal.ReleaseComObject(XLSApp)
GC.Collect()

schließen. Tut Sie aber leider nicht.


Mit diesem Snippet wird ein für alle Mal der spezielle Excel Prozess beendet, OHNE alle anderen Excel Prozesse mit in den Abgrund zu reißen.

Sicherlich ist diese Funktion auch für andere Bereiche interessant...
''Zugang zur API ''user32'' 
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Integer, ByRef lpdwProcessId As IntPtr) As IntPtr

''Beenden eines speziellen Excel Prozesses, anhand seiner Id
Private Shared Sub killExcelInstanceById(ByRef xlsApp As Excel.Application)

            
Dim processId As IntPtr

''API Funktion, out val: processId
GetWindowThreadProcessId(xlsApp.Hwnd,processId)

''Prozess erstellen
Dim excelProcess As Process = Process.GetProcessById(processId.ToInt32())

Debug.WriteLine(processId)

''die lang ersehnte Erlösung, für den speziellen Excel Process der XlsApp :)
excelProcess.Kill() 
End Sub

2 Kommentare zum Snippet

Radames schrieb am 7/3/2009:
perfekt ...
nachdem ich stundenlang getrickst habe, hab ich hier endlich eine lösung gefunden!
tausend dank!
Compufreak schrieb am 7/3/2009:
Hervorragend, endlich läuft meine Applikation etwas sauberer =)

Hier das Ganze in Csharp übersetzt, werde das nach Anfrage an den Autor evtl. auch hier einstellen :
[code language="C#"]//http://dotnet-snippets.de/dns/excel-prozess-schliessen-SID1153.aspx
[System.Runtime.InteropServices.DllImport("user32.DLL")]
public static extern IntPtr GetWindowThreadProcessId(int hWnd, ref IntPtr lpdwProcessID);

/// <summary>
/// kills an Excel application
/// </summary>
/// <param name="myExcelApp">The application to kill</param>
public static void killExcelInstanceById(ref Microsoft.Office.Interop.Excel.Application myExcelApp)
{
IntPtr processID = new IntPtr() ;

//API Funktion, out val: processId
GetWindowThreadProcessId(myExcelApp.Hwnd, ref processID);
System.Diagnostics.Process myExcelProcess = System.Diagnostics.Process.GetProcessById(processID.ToInt32());

// kill it!
myExcelProcess.Kill();
}[/code]
 

Logge dich ein, um hier zu kommentieren!