Fechar um processo.
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.
Até aí tudo bem, nessa aplicação secundária eu gravado em uma tabela o Handle dele, no caso:
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:
Att,
Thiago irrazabal de Oliveira.
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
Curtidas 0
Respostas
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:
Depois quando eu preciso para o processo só faço isso:
É isso aí, valeu.
Att,
Thiago Irrazabal de Oliveira.
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