Process oder Task killen
-
Wo finde ich denn in der CreateProcess Funktion etwas dass ein Handle zurückgibt?
Kann man eigendlich auch nach nem Process mit Namen suchen und davon das Handle herrausbekommen ?
[ Dieser Beitrag wurde am 22.05.2003 um 17:29 Uhr von 5kYw4lKeR editiert. ]
-
Denk dir meinen obigen Beitrag mit ShellExecute statt mit CreateProcess, dann müsste er stimmen

-
hmm, ShellExecute gibt HINSTANCE zurück, damit kann ich irgendwie nix anfangen.
der erste parameter ist ein HWND, aber dabei handelt es sich anscheinend um ein Handle für ein parent. Hier die erklärung aus der msdn:Window handle to a parent window. This window receives any message boxes that an application produces.
-
das übergibst du, dieses handle gibt an, welches fenster als parent für den neu gestarteten prozess benutzt werden soll.
-
blubber bla ... nimm ShellExecuteEx

-
Du kannst dich auch nicht entscheiden

Aber die funktion sieht ganz gut aus, in SHELLEXECUTEINFO wird auch endlich ma nen handle zurückgegeben

Ich werds mal versuchen ...
-
Hmm soweit so gut, aber jetzt habe ich einen fehler wenn ich die andwendung starten will, es passiert nämlich ganichts, hab mal mit GetLastError() die letze fehlermeldung abgefangen und anscheinend ist es "ERROR_ACCESS_DENIED" Aber warum ?
Hier mal ein kleiner Programmausschnitt:SHELLEXECUTEINFO m_sei; //m_sei.cbSize = 0; <-Brauch ich das ? Wenn ja wie bekomm ich die richtige größe? m_sei.lpVerb = "Open"; m_sei.fMask = SEE_MASK_NOCLOSEPROCESS; m_sei.lpFile = "notepad.exe"; m_sei.lpDirectory = "C:\\Windows\\"; m_sei.nShow = SW_SHOW; ShellExecuteEx(&m_sei); if (GetLastError()==ERROR_ACCESS_DENIED) MessageBox("Error Access Denied");
-
Original erstellt von 5kYw4lKeR:
**```
SHELLEXECUTEINFO m_sei;
//m_sei.cbSize = 0; <-Brauch ich das ? Wenn ja wie bekomm ich die richtige größe?Na, wie bekommt man die Größe von etwas?
m_sei.cbSize = sizeof(SHELLEXECUTEINFO);
-
Darauf bliebt "cbSize" immer 60 und es gibt einen Ausnahmefehler in der Kernel32
-
Hm, und kannste mal vor der Strukturinitialisierung ein ZeroMemory aufrufen?
-
Thx, jetzt funzts !!!
-
Mit CreateProcess gehts aber auch:
Das Handle steckt in der PROCESS_INFORMATION Struktur.
CString Pfad = "C:\\Programme\\Internet Explorer\\IEXPLORE.EXE"; PROCESS_INFORMATION pin; ... ... CreateProcess (Pfad,NULL,..., &si, &pin); HANDLE hHandle = pin.hProcess;Später dann:
TerminateProcess(hHandle,0); // Schießt das Programm ab[ Dieser Beitrag wurde am 27.05.2003 um 03:42 Uhr von Mr. IfThen editiert. ]
-
hi!!! kann das jemand testen????
/**************************************************************************** Bestimmt das zum übergebenen Prozess-Exectuable gehörende Prozess-Handle und gibt es zurück. Übergabe strProcessExe Prozess-Executable. dwDesiredAccess Benötigter Prozess-Zugriff. Rückgabe Zugehöriges Handle oder NULL im Fehlerfall. ***************************************************************************** HANDLE GetProcessHandle( CString strProcessExe, DWORD dwDesiredAccess ) { HANDLE hSnapShot; // System-Snap-Shot-Handle PROCESSENTRY32 PEntry; // Process-Enumerations-Struktur HANDLE hProcess; // Prozess-Handle CString strExeFile; // Hilfssstring BOOL bOK; // Abbruch-Flag // Liste aller im System laufenden Prozesse erstellen hSnapShot=::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); if( hSnapShot==INVALID_HANDLE_VALUE ) // Fehler aufgetreten return NULL; // Prozess-Executable in Kleinbuchstaben wandeln strProcessExe.MakeLower( ); // Prozess-Liste durchlaufen PEntry.dwSize=sizeof( PEntry ); bOK=::Process32First( hSnapShot, &PEntry ); for( ; bOK; bOK=::Process32Next( hSnapShot, &PEntry )){ // Pozess-ID in Handle umwandeln hProcess=::OpenProcess( dwDesiredAccess, FALSE, PEntry.th32ProcessID ); if( hProcess==NULL ) // Umwandlung misslungen continue; // Prozess-Executable in Kleinbuchstaben wandeln und prüfen strExeFile=PEntry.szExeFile; strExeFile.MakeLower( ); if( strExeFile.Find( strProcessExe )!=-1 ) // Passenden Prozess gefunden, Handle zurückgeben return hProcess; } // Nichts Passendes gefunden return NULL; } Damit kannst Du mit TerminateProcess( GetProcessHandle( "apache.exe", PROCESS_TERMINATE ), 0 ); einen laufenden Prozess "test.exe" beenden. Das gelingt aber nur, wenn der ausführende Benutzer auch die entsprechenden Rechte besitzt. GetProcessHandle( ... ) kehrt bei fehlenden Rechten der einem anderen Fehler mit NULL zurück. Des Weiteren musst Du darauf achten, bei der Executable keinen Pfad anzugeben.bitte mich informieren obs geht!
lg
-
/**************************************************************************** Bestimmt das zum übergebenen Prozess-Exectuable gehörende Prozess-Handle und gibt es zurück. Übergabe strProcessExe Prozess-Executable. dwDesiredAccess Benötigter Prozess-Zugriff. Rückgabe Zugehöriges Handle oder NULL im Fehlerfall. *****************************************************************************/ /HANDLE GetProcessHandle( CString strProcessExe, DWORD dwDesiredAccess ) { HANDLE hSnapShot; // System-Snap-Shot-Handle PROCESSENTRY32 PEntry; // Process-Enumerations-Struktur HANDLE hProcess; // Prozess-Handle CString strExeFile; // Hilfssstring BOOL bOK; // Abbruch-Flag // Liste aller im System laufenden Prozesse erstellen hSnapShot=::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); if( hSnapShot==INVALID_HANDLE_VALUE ) // Fehler aufgetreten return NULL; // Prozess-Executable in Kleinbuchstaben wandeln strProcessExe.MakeLower( ); // Prozess-Liste durchlaufen PEntry.dwSize=sizeof( PEntry ); bOK=::Process32First( hSnapShot, &PEntry ); for( ; bOK; bOK=::Process32Next( hSnapShot, &PEntry )){ // Pozess-ID in Handle umwandeln hProcess=::OpenProcess( dwDesiredAccess, FALSE, PEntry.th32ProcessID ); if( hProcess==NULL ) // Umwandlung misslungen continue; // Prozess-Executable in Kleinbuchstaben wandeln und prüfen strExeFile=PEntry.szExeFile; strExeFile.MakeLower( ); if( strExeFile.Find( strProcessExe )!=-1 ) // Passenden Prozess gefunden, Handle zurückgeben return hProcess; } // Nichts Passendes gefunden return NULL; } Damit kannst Du mit TerminateProcess( GetProcessHandle( "test.exe", PROCESS_TERMINATE ), 0 ); einen laufenden Prozess "test.exe" beenden. Das gelingt aber nur, wenn der ausführende Benutzer auch die entsprechenden Rechte besitzt. GetProcessHandle( ... ) kehrt bei fehlenden Rechten der einem anderen Fehler mit NULL zurück. Des Weiteren musst Du darauf achten, bei der Executable keinen Pfad anzugeben.bitte testen!!!
lg
-
bitte mal testen!!!
/**************************************************************************** Bestimmt das zum übergebenen Prozess-Exectuable gehörende Prozess-Handle und gibt es zurück. Übergabe strProcessExe Prozess-Executable. dwDesiredAccess Benötigter Prozess-Zugriff. Rückgabe Zugehöriges Handle oder NULL im Fehlerfall. *****************************************************************************/ HANDLE GetProcessHandle( CString strProcessExe, DWORD dwDesiredAccess ) { HANDLE hSnapShot; // System-Snap-Shot-Handle PROCESSENTRY32 PEntry; // Process-Enumerations-Struktur HANDLE hProcess; // Prozess-Handle CString strExeFile; // Hilfssstring BOOL bOK; // Abbruch-Flag // Liste aller im System laufenden Prozesse erstellen hSnapShot=::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); if( hSnapShot==INVALID_HANDLE_VALUE ) // Fehler aufgetreten return NULL; // Prozess-Executable in Kleinbuchstaben wandeln strProcessExe.MakeLower( ); // Prozess-Liste durchlaufen PEntry.dwSize=sizeof( PEntry ); bOK=::Process32First( hSnapShot, &PEntry ); for( ; bOK; bOK=::Process32Next( hSnapShot, &PEntry )){ // Pozess-ID in Handle umwandeln hProcess=::OpenProcess( dwDesiredAccess, FALSE, PEntry.th32ProcessID ); if( hProcess==NULL ) // Umwandlung misslungen continue; // Prozess-Executable in Kleinbuchstaben wandeln und prüfen strExeFile=PEntry.szExeFile; strExeFile.MakeLower( ); if( strExeFile.Find( strProcessExe )!=-1 ) // Passenden Prozess gefunden, Handle zurückgeben return hProcess; } // Nichts Passendes gefunden return NULL; } Damit kannst Du mit TerminateProcess( GetProcessHandle( "test.exe", PROCESS_TERMINATE ), 0 ); einen laufenden Prozess "test.exe" beenden. Das gelingt aber nur, wenn der ausführende Benutzer auch die entsprechenden Rechte besitzt. GetProcessHandle( ... ) kehrt bei fehlenden Rechten der einem anderen Fehler mit NULL zurück. Des Weiteren musst Du darauf achten, bei der Executable keinen Pfad anzugeben.
-
Bist du bescheuert??
CLOSED