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.