Times ago, some of you sent me code with a "KillTask" procedure. I would like to know how to implement a KillTaskTree-like procedure. In practice sometimes my application A faults and a 'deamon' D is able [by using the code you sent me] to checks this condition, to definitively close A and restart it through ShellExecute. However for some application faults, a O.S. window E describing the error is open and KillTask does not make it closing. So i suppose that an extended KillTask which kills also child processes could be able to do it. Of course I suppose such a window E is generated as child process from A.
any help? thanks, Mauro Russo. ----- Original Message ----- From: Charlie Chambers To: [email protected] Sent: Monday, March 02, 2009 3:20 PM Subject: Re: [delphi-en] Process run check Hi Mauro, Do you have ShellAPI in the uses section? This unit is needed to make the call. hWnd is an integer and will not translate except as a number, but i'm sure you are aware of that. You can use it to get the get the exe name but it's not completely straight forward. You might want to review the help file on Window API calls (Windows SDK). Also, the book "The Tomes of Delphi 3 Win32 Core API" is a great book and not completely out of date. It has Delphi examples as to using API calls. I do have a unit that has a number of these calls that i use and can email if you should have need. Cheers, Charlie ----- Original Message ----- From: mauro russo To: [email protected] Sent: Monday, March 02, 2009 5:53 AM Subject: Re: [delphi-en] Process run check Dear, my call to FindWindow seems to don't work. to understand what to change I would like to use EnumWindows, but I also need an API to translate the HWND to a String, in order to list all applicatino running and understand what is my mistake in using FindWindow. Nay help? ----- Original Message ----- From: Claudiu Savu To: [email protected] Sent: Saturday, February 28, 2009 8:59 PM Subject: Re: [delphi-en] Process run check You say you want to know if the app is not responding anymore, here is a code for detection: got it from: http://www.delphi3000.com/articles/article_3295.asp?SK=word // For Win9x/ME function IsAppRespondig9x(dwThreadId: DWORD): Boolean; type TIsHungThread = function(dwThreadId: DWORD): BOOL; stdcall; var hUser32: THandle; IsHungThread: TIsHungThread; begin Result := True; hUser32 := GetModuleHandle('user32.dll'); if (hUser32 > 0) then begin @IsHungThread := GetProcAddress(hUser32, 'IsHungThread'); if Assigned(IsHungThread) then begin Result := not IsHungThread(dwThreadId); end; end; end; // For Win NT/2000/XP function IsAppRespondigNT(wnd: HWND): Boolean; type TIsHungAppWindow = function(wnd:hWnd): BOOL; stdcall; var hUser32: THandle; IsHungAppWindow: TIsHungAppWindow; begin Result := True; hUser32 := GetModuleHandle('user32.dll'); if (hKernel > 0) then begin @IsHungAppWindow := GetProcAddress(hUser32, 'IsHungAppWindow'); if Assigned(IsHungAppWindow) then begin Result := not IsHungAppWindow(wnd); end; end; end; function IsAppRespondig(Wnd: HWND): Boolean; begin if not IsWindow(Wnd) then begin ShowMessage('Incorrect window handle'); Exit; end; if Win32Platform = VER_PLATFORM_WIN32_NT then Result := IsAppRespondigNT(wnd) else Result := IsAppRespondig9X(GetWindowThreadProcessId(wnd,nil)); end; // Example: Check if Word is hung/responing procedure TForm1.Button3Click(Sender: TObject); var Res: DWORD; h: HWND; begin // Find Word by classname h := FindWindow(PChar('OpusApp'), nil); if h <> 0 then begin if IsAppRespondig(h) then ShowMessage('Word is responding') else ShowMessage('Word is not responding'); end else ShowMessage('Word is not open'); end; also this is a function to kill the not responding app: // uses Tlhelp32 function KillTask(ExeFileName: string): integer; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin result := 0; FSnapshotHandle := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := Sizeof(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then Result := Integer(TerminateProcess(OpenProcess( PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0)); ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; Cheers, Claudiu ----- Original Message ----- From: "mauro russo" <[email protected]> To: "delphi-en" <[email protected]> Sent: Saturday, February 28, 2009 8:17 PM Subject: [delphi-en] Process run check Dear, how to check if an .exe is in execution? In practice I would like to be sure that, if a my application A1 faults and is closed, it is automatically restarted. I thought to use a secondary very simple deamon application A2 which checks if A1 is in execution and, if not, launches it by ShelExecute. Moreover A1 does the same with A2. Really I would like to use a S.O. resource to make A1 and A2 periodically "speaking" each other. So, if A1 is running, but hanging, A2 can choose to Terminate it and restart it. I believe there is some simplier way to obtain my goal, but I am not expert about windows API. Some help? Regards, Mauro. ---------- Questa email è stata verificata dal sistema centralizzato antivirus della UniPlan Software [Non-text portions of this message have been removed] ------------------------------------ ----------------------------------------------------- Home page: http://groups.yahoo.com/group/delphi-en/ To unsubscribe: [email protected]! Groups Links __________ Information from ESET NOD32 Antivirus, version of virus signature database 3895 (20090227) __________ The message was checked by ESET NOD32 Antivirus. http://www.eset.com ---------- Questa email è stata verificata dal sistema centralizzato antivirus della UniPlan Software [Non-text portions of this message have been removed] [Non-text portions of this message have been removed] ---------- Questa email è stata verificata dal sistema centralizzato antivirus della UniPlan Software [Non-text portions of this message have been removed]

