}
[/code]
Este código funciona muito bem.
O EXE abre o meu programa Java, e fica aparecendo no Gerenciador de Tarefas. Mas eu gostaria que, ao matar o processo desse executável no Gerenciador de Processos, que matasse meu programa tbem; igual acontece com o Netbeans.
Você pode fazer o seguinte. Eu acho que deve ter um modo melhor de fazer, mas acho que isso funciona:
[code]#include <windows.h>
int main() {
STARTUPINFO infoBina={sizeof(infoBina)};
PROCESS_INFORMATION processInfoBina; //infoBina.dwFlags = STARTF_USESHOWWINDOW; //infoBina.wShowWindow = SW_HIDE;
DWORD result
if (CreateProcess(NULL, "java -jar medfour-technic.jar", NULL, NULL, FALSE,
0, NULL, NULL, NULL, &processInfoBina)) {//Perceba que eu removi o penúltimo parâmetro da função, pois ele é desnecessário.
while(1)
{
result = WaitForSingleObject(processInfoBina.hProcess, INFINITE);//WaitForSingleObject retorna WAIT_OBJECT_0 caso o processo seja encerrado
if (result = WAIT_OBJECT_0)
{
EnumWindows(&finishApp, processInfoBina.dwProcessId);
break;
}
}
CloseHandle(processInfoBina.hProcess);
CloseHandle(processInfoBina.hThread);
}
return 0;
Obrigada pela ajuda e desculpe pelas perguntas, mas não sou programadora C… :oops: eu arranho aqui pra fazer as coisas que eu preciso…
Compilou aqui certinho, mas quando eu executo o EXE, dá a seguinte mensagem: O medfour.exe encontrou um problema e precisa ser fechado.
O que pode estar gerando erro aqui?
A única coisa que eu não consigo entender é que, quando eu fecho o meu executável pelo Gerenciador de Tarefas, ele não está fazendo o que eu quero, que é fechar a minha aplicação java
O problema é detectar o momento em que o processo é encerrado.
Fazendo isso, pode-se chamar a função EnumWindows, passando como parâmetro o callback de finishApp e o ID do processo. Essa função EnumWindows procura janelas que estejam associadas com o processo definido pelo parâmetro ID e faz com essa janela o que foes específicado pela função que EnumWindows recebe como parâmetro. Nesse caso, EnumWindow recebe como parâmetro a função finishApp e essa função encerra a aplicação através da seguinte chamada:
Onde esse hhwnd é um handle (ponteiro) para a Janela da aplicação.
[quote=entanglement]O seu problema é que você gostaria de ter um relacionamento pai-filho entre processos, que é uma coisa que não existe “por padrão” no Windows.
Olá entanglement!
Pesquisei bastante sobre o link que vc me passou, e saiu esse código abaixo… mas acho que tem algo de errado, porque eu não tou conseguindo matar o processo do Java junto com o meu executável.
Acho que esse TerminateJobObject que você criou não está certo.
Ele recebe como parâmetro um handle para para o Job que você criou. Até ai tá certo. Mas o segundo parâmetro é o código de saída do seu processo. E pelo que consta na API, 0 é quando o processo apresanta uma falha de execução. Você deve usar GetExitCodeProcess para obter o valor que será passado como parâmetro para TerminateJobObject. Veja se é isso.
[quote=eliangela][quote=entanglement]O seu problema é que você gostaria de ter um relacionamento pai-filho entre processos, que é uma coisa que não existe “por padrão” no Windows.
Olá entanglement!
Pesquisei bastante sobre o link que vc me passou, e saiu esse código abaixo… mas acho que tem algo de errado, porque eu não tou conseguindo matar o processo do Java junto com o meu executável.
Acabei de notar uma coisa estranha no seu código. Você tá associando o Job com um processo que ainda não foi criado. Não seria o certo chamar o create process e depois passar o handle desse processo para a função AssignProcessToJobObject? Porque da forma que está, quando você encerrar o Job, o processo da sua aplicação Java não será encerrado.
[quote=matheuslmota]Acho que esse TerminateJobObject que você criou não está certo.
Ele recebe como parâmetro um handle para para o Job que você criou. Até ai tá certo. Mas o segundo parâmetro é o código de saída do seu processo. E pelo que consta na API, 0 é quando o processo apresanta uma falha de execução. Você deve usar GetExitCodeProcess para obter o valor que será passado como parâmetro para TerminateJobObject. Veja se é isso.
[/quote]
Vou verificar isso aqui… acho que amanhã cedo consigo postar alguma resposta aqui.
Obrigada[/quote]
Mas a ordem é essa mesmo. O que tá errado é que você tá passando para o AssignProcessToJobObject um handle que era pra apontar pra um processo, mas que na verdade não aponta para nada:
[code] HANDLE job = CreateJobObject(NULL, “medfour”);
AssignProcessToJobObject(job, processInfoBina.hProcess); //processInfoBina.hProcess ainda não foi inicializado. O Job foi associado a um processo que ainda não existe
if (CreateProcess(NULL, "java -jar medfour-technic.jar", NULL, NULL, FALSE,
0, NULL, NULL, &infoBina, &processInfoBina)) { Aqui o processInfoBina.hProcess foi inicializado, mas o Job não tem ciencia da existência desse processo
WaitForSingleObjectEx(processInfoBina.hProcess, INFINITE, TRUE);
TerminateJobObject(job, 0);
CloseHandle(processInfoBina.hProcess);
CloseHandle(processInfoBina.hThread);
}[/code]