Process oder Task killen



  • 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


Anmelden zum Antworten