Process handles



  • Hi Leute,
    hab mit folgender Funktion das Problem das Process Handles wie blöd erzeugt werden und nicht nach dem verwenden wieder freigegeben. Ich möchte nur überwachen ob der gewünschte Process läuft. Was mach ich falsch ?

    void __fastcall TForm1::ProcessCheckTimer1(TObject *Sender)
    {
       HANDLE process =  GetProcessHandle("LFS.exe",PROCESS_ALL_ACCESS);
       if(process == NULL)
      {
        BitBtn2->Caption = "Start Server";
        process_id = 0;
        ProcessTimer1->Enabled = false;
        insimready = false;
        insimlist->Clear();
      }
    
      CloseHandle(process);
      delete process;
    
    }
    


  • Hallo

    CloseHandle übernimmt für dich bereits das Aufräumne des handles, das delete danach ist ein eindeutiger Fehler.

    Das ganze kannst du übrigens mit der WinAPI-Funktion WaitForSingleObjekt wesentlich eleganter lösen. Dazu findest du sicher mehr im WinAPI-Forum.

    bis bald
    akari



  • Fein Fein akari 🙂

    Ich warte jetzt nach dem erstellen des Prozesses (CreateProcess) auf das Process Ende ohne einen Timer:

    while(WaitForSingleObject(stgProcessInfo.hProcess, 100) == WAIT_TIMEOUT && Application->Terminated == false)
    {
      Application->ProcessMessages();
    }
    GetExitCodeProcess(stgProcessInfo.hProcess, &ExitCode);
    CloseHandle(stgProcessInfo.hProcess);
    

    Das Funktioniert jetzt wunderbar. Ich hab aber das Problem das in folgender Funktio nicht alle Handles sauber freigegeben werden. Was mache ich hier falsch ?

    HANDLE GetProcessHandle(String strProcessExe, DWORD dwDesiredAccess)
    {
     HANDLE hSnapShot; // System-Snap-Shot-Handle
     PROCESSENTRY32 PEntry; // Process-Enumerations-Struktur
     HANDLE hProcess; // Prozess-Handle
     String strExeFile; // Hilfssstring
     bool bOK; // Abbruch-Flag
    
     hSnapShot=::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );// Liste aller im System laufenden Prozesse erstellen
    
     if( hSnapShot==INVALID_HANDLE_VALUE )// Fehler aufgetreten
     return NULL;
    
     // Prozess-Liste durchlaufen
     PEntry.dwSize=sizeof( PEntry );
     bOK=::Process32First( hSnapShot, &PEntry );
     for( ; bOK; bOK=::Process32Next( hSnapShot, &PEntry ))
     {
       hProcess=::OpenProcess( dwDesiredAccess, FALSE, PEntry.th32ProcessID );// Pozess-ID in Handle umwandeln
       if( hProcess==NULL )// Umwandlung misslungen
       continue;
    
       // Prozess-Executable prüfen
       strExeFile=PEntry.szExeFile;
       if(strExeFile == strProcessExe && PEntry.th32ProcessID == process_id) // Passenden Prozess gefunden, Handle zurückgeben
       return hProcess;
     }
     // Nichts Passendes gefunden
     return NULL;
    }
    

    Edit: Habs jetzt so gemacht das ich das HANDLE was von GetProcessHandle zurück gegeben wird freigebe.


Anmelden zum Antworten