Fechar um processo.

Delphi

02/07/2014

Bom dia, estou com um probleminha e não estou conseguindo solucionar, primeiramente a explicação.

Tenho uma aplicação principal(EXE) com diversas DLL's, em determinado ponto eu abro uma outra aplicação(EXE), com o ShellExecute.
ShellExecute(Handle, 'Open', PChar(ExtractFilePath(ParamStr(0)) + 'Sis_Exec_SQL.exe'), '', '', SW_HIDE);


Até aí tudo bem, nessa aplicação secundária eu gravado em uma tabela o Handle dele, no caso:
Application.Handle;


Ok, até aí tudo bem também(eu acho), essa aplicação secundária está lá rodando normalmente, até que na minha aplicação principal eu clicko em um botão para parar a execução dessa aplicação secundária, eu faço select na tabela onde essa aplicação secundária gravou o seu handle, e dou ProcessTerminate(HWND, 0), onde HWND é a variável que guardou o resultado o select, porem aí está o problema, não acontece nada, ele não fecha a outra aplicação.

P.S.: Antes que me digam para usar o FindWindow e me passem link desses códigos, já aviso que não posso usá-lo, não servem para o meu caso, também não posso usar isso aqui:
function KillTask(ExeFileName: string): Integer;
const
  PROCESS_TERMINATE = $0001;
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;




Att,
Thiago irrazabal de Oliveira.
Thiago Irrazabal

Thiago Irrazabal

Curtidas 0

Respostas

Thiago Irrazabal

Thiago Irrazabal

02/07/2014

Opa, resolvi já, caso alguém tenha uma dúvida parecida futuramente eis aqui a solução.

O Application.Handle não é o processo que o windows cria por isso não fechava. Controlei o processo mudando o ShellExecute() por ShellExecuteEx(), esse ShellExecuteEx retorna o numero do processo, embora tenha os parâmetros diferentes sanou minha própria dúvida, aqui o código dos parâmetros que essa função recebe:
var
  Shell: TShellExecuteInfo;
begin
  FillChar(Shell, SizeOf(Shell), 0);//LIMPA/ZERA O OBJETO

  with Shell do
    begin
      cbSize := SizeOf(Shell);
      fMask := SEE_MASK_NOCLOSEPROCESS;
      Wnd := GetDesktopWindow;
      lpFile := PChar(ExtractFilePath(ParamStr(0)) + 'Sis_Exec_SQL.exe');//LOCAL DO EXECUTAVEL
      lpParameters := nil;//PARÂMETROS, NO MEU CASO NÃO TEM ENTÃO PASSO NIL
      nShow := SW_HIDE;//COMO VAI MOSTRAR O PROGRAMA
      ShellExecuteEx(@Shell);
    end;
end; 


Depois quando eu preciso para o processo só faço isso:
  TerminateProcess(Shell.hProcess, 0);


É isso aí, valeu.




Att,
Thiago Irrazabal de Oliveira.
GOSTEI 0
POSTAR