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.
GetWindowThreadProcessId seta um handle que aponta para a janela associada com o processo do seu aplicativo.
Espero que essas informações lhe ajudem.
M
matheuslmota
Você pode fazer o seguinte. Eu acho que deve ter um modo melhor de fazer, mas acho que isso funciona:
#include<windows.h>intmain(){STARTUPINFOinfoBina={sizeof(infoBina)};PROCESS_INFORMATIONprocessInfoBina;//infoBina.dwFlags = STARTF_USESHOWWINDOW;//infoBina.wShowWindow = SW_HIDE;DWORDresultif(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 encerradoif(result=WAIT_OBJECT_0){EnumWindows(&finishApp,processInfoBina.dwProcessId);break;}}CloseHandle(processInfoBina.hProcess);CloseHandle(processInfoBina.hThread);}return0;}BOOLfinishApp(hHwnd:HWND;dwData:LPARAM){DWORDvID;GetWindowThreadProcessID(hHwnd,&vID);if(vID==dwData){PostMessage(hHwnd,WM_CLOSE,0,0);returnFalse;}else{returnTrue;}}
Espero que isso resolva seu problema.
Ao usuário entanglement: existe alguma forma mais elegante de se fazer isso?
E
eliangela
Olá!
Obrigada pela ajuda, mas o código tá dando um erro de compilação na linha 16 :(
invalid conversion from `BOOL (*)(HWND__*, LPARAM)' to `BOOL (*)(HWND__*, LPARAM)'
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?
Obrigada
E
eliangela
Olá!
Consegui fazer funcionar!
Coloquei de volta o código:
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 :(
Obrigada
E
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.
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.
E
eliangela
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.
M
matheuslmota
eliangela:
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.
Vou verificar isso aqui… acho que amanhã cedo consigo postar alguma resposta aqui.
Obrigada
E
eliangela
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.
Vou tentar isso tbem.
Obrigada
M
matheuslmota
eliangela:
matheuslmota:
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.
Vou verificar isso aqui... acho que amanhã cedo consigo postar alguma resposta aqui.
Obrigada
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:
HANDLEjob=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 existeif(CreateProcess(NULL,"java -jar medfour-technic.jar",NULL,NULL,FALSE,
0,NULL,NULL,&infoBina,&processInfoBina)){AquioprocessInfoBina.hProcessfoiinicializado,masoJobnãotemcienciadaexistênciadesseprocessoWaitForSingleObjectEx(processInfoBina.hProcess,INFINITE,TRUE);TerminateJobObject(job,0);CloseHandle(processInfoBina.hProcess); CloseHandle(processInfoBina.hThread); }