Autor
|
Thema: VBA-Excel-Process-Kill-aus-Taskmanager (8434 mal gelesen)
|
Feyza Mitglied
Beiträge: 605 Registriert: 12.01.2004 AutoCAD Mechanical 2006 Partsolution V8 Catia V5R14Sp4 Windows 2000/XP VB6 / VB.NET /VisualStudio2005 Windows Server 2003 ASP.net
|
erstellt am: 19. Jul. 2007 09:42 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen an Alle, wir möchten gerne einen Process, der im Taskmanager zu sehen ist, killen. Unter .net sind sehr viele Beispiele im Internet, nur bei VBA - Excel haben wir nichts gefunden. Könnt Ihr uns hier bitte weiterhelfen. Danke für Eure Bemühungen.
------------------ Schöne Grüße Feyza : ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Oberli Mike Ehrenmitglied V.I.P. h.c. Dipl. Maschinen Ing.
Beiträge: 3728 Registriert: 29.09.2004 Excel 2010 128GB SSD Windows 7
|
erstellt am: 19. Jul. 2007 09:58 <-- editieren / zitieren --> Unities abgeben: Nur für Feyza
Hallo Feyza, Wie hatten mal das Problem, dass wir beim Start einer Applikation einen Prozesse killen mussten. Wir verwendeten das pskill.exe, angesteuert über ein bat-File. Ev. kannst du aus VBA ein bat File starten, im extremfall sogar zuerst erzeugen, dann starten, und dann wieder löschen. Gruss Mike ------------------
The Power Of Dreams Schreib mal wieder Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Feyza Mitglied
Beiträge: 605 Registriert: 12.01.2004 AutoCAD Mechanical 2006 Partsolution V8 Catia V5R14Sp4 Windows 2000/XP VB6 / VB.NET /VisualStudio2005 Windows Server 2003 ASP.net
|
erstellt am: 19. Jul. 2007 10:38 <-- editieren / zitieren --> Unities abgeben:
Hallo Mike, danke Dir. Beispiele us dem Internet: =AUSF("command /c c:\xyz.bat"; 1) als Internationale Makrovorlage: =EXEC("command /c c:\temp\xxx.bat",1) VBA (VISUAL BASIC für Applikationen): x = STARTE("command /c c:\xyz.bat"; 1) oder in englisch: x = SHELL("command /c c:\xyz.bat", 1) Werden dies auch mit einer bat Datei umsetzten : )) ------------------ Schöne Grüße Feyza : ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Nepumuk Mitglied Entwicklungsleiter
Beiträge: 351 Registriert: 16.10.2004
|
erstellt am: 19. Jul. 2007 17:35 <-- editieren / zitieren --> Unities abgeben: Nur für Feyza
Hallo, mal zwei Beispiele. 1. Per API: Code: Option ExplicitPrivate Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" ( _ ByVal lFlgas As Long, _ ByVal lProcessID As Long) As Long Private Declare Function TerminateProcess Lib "kernel32" ( _ ByVal hProcess As Long, _ ByVal uExitCode As Long) As Long Private Declare Function OpenProcess Lib "kernel32" ( _ ByVal dwDesiredAccess As Long, _ ByVal bInheritHandle As Long, _ ByVal dwProcessId As Long) As Long Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" ( _ ByVal hSnapshot As Long, _ ByRef uProcess As PROCESSENTRY32) As Long Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" ( _ ByVal hSnapshot As Long, _ ByRef uProcess As PROCESSENTRY32) As Long Private Declare Function CloseHandle Lib "kernel32" ( _ ByVal hObject As Long) As Long Private Type PROCESSENTRY32 dwSize As Long cntUsage As Long th32ProcessID As Long th32DefaultHeapID As Long th32ModuleID As Long cntThreads As Long th32ParentProcessID As Long pcPriClassBase As Long dwflags As Long szexeFile As String * 260 End Type Private Const PROCESS_TERMINATE = &H1 Private Const GW_HWNDNEXT As Long = 2 Private Sub KillEXE(ByVal strEXEName As String) Dim lngHandle As Long, retVal As Long, hTask As Long, lResult As Long Dim pe32current As PROCESSENTRY32 lngHandle = CreateToolhelpSnapshot(2&, 0&) If lngHandle <> 0 Then pe32current.dwSize = Len(pe32current) retVal = ProcessFirst(lngHandle, pe32current) Do While Not (retVal = 0) If InStr(1, pe32current.szexeFile, strEXEName, vbTextCompare) > 0 Then hTask = OpenProcess(PROCESS_TERMINATE, 0&, pe32current.th32ProcessID) lResult = TerminateProcess(hTask, 1&) lResult = CloseHandle(hTask) Exit Sub End If retVal = ProcessNext(lngHandle, pe32current) Loop CloseHandle lngHandle End If End Sub Public Sub test() Call KillEXE("sol.exe") End Sub
2. Per WMI: Code: Sub test() Dim objWMI As Object, objProcessList As Object, objProcess As Object Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ ".\root\cimv2") Set objProcessList = objWMI.ExecQuery("Select * from Win32_Process " & _ "Where Name = 'sol.exe'") For Each objProcess In objProcessList objProcess.Terminate (0) Next End Sub
Beide Beispiele beenden sol.exe (Solitär). ------------------ Gruß Nepumuk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Feyza Mitglied
Beiträge: 605 Registriert: 12.01.2004 AutoCAD Mechanical 2006 Partsolution V8 Catia V5R14Sp4 Windows 2000/XP VB6 / VB.NET /VisualStudio2005 Windows Server 2003 ASP.net
|
erstellt am: 20. Jul. 2007 08:21 <-- editieren / zitieren --> Unities abgeben:
|
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004 .
|
erstellt am: 20. Jul. 2007 09:12 <-- editieren / zitieren --> Unities abgeben: Nur für Feyza
Auch Hallo, Weitere 2 Möglichkeiten: 1. mit pskill vom 'ehemaligen' Sysinternals reicht - falls dieses im Suchpfad liegt - auch ein: Sub x() Shell "pskill sol.exe" End Sub http://www.microsoft.com/technet/sysinternals/default.mspx 2. Wenn man das Teil selber mit Shell gestartet hat kann man auch über die von shell zurückgelieferte Task-Id gehen.
Code:
Option ExplicitPrivate Declare Function OpenProcess Lib "kernel32" ( _ ByVal dwDesiredAccess As Long, _ ByVal bInheritHandle As Long, _ ByVal dwProcessId As Long) As Long Private Declare Function CloseHandle Lib "kernel32" ( _ ByVal hObject As Long) As Long Private Declare Function TerminateProcess Lib "kernel32" ( _ ByVal hProcess As Long, _ ByVal uExitCode As Long) As Long Const PROCESS_TERMINATE = &H1 Sub StartIt() Dim lngTaskId As Long lngTaskId = Shell("notepad.exe") MsgBox "nach OK wird Notepad beendet" StopIt lngTaskId End Sub Sub StopIt(ByVal lngTaskId As Long) Dim lngHandle As Long Dim lngResult As Long Dim lngExitCode As Long If lngTaskId Then lngHandle = OpenProcess(PROCESS_TERMINATE, False, lngTaskId) If lngHandle Then lngResult = TerminateProcess(lngHandle, lngExitCode) lngResult = CloseHandle(lngHandle) End If End If End Sub
cu, Bernd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|