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]

Reply via email to