Pergunta

Eu estou tentando lançar um outro processo a partir de um serviço (que é um aplicativo de console que recolhe alguns dados e escreve-lo para o registro), mas por alguma razão eu não posso obtê-lo para lançar corretamente.

básico I do que estou estou tentando fazer é a seguinte:

  1. Inicie o processo
  2. Aguarde até que o processo seja concluído
  3. Recuperar o código de retorno do processo

Atualmente, estou usando o seguinte código:

STARTUPINFO info={sizeof(info)};
PROCESS_INFORMATION processInfo;
if (CreateProcess(PATH, ARGS, NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo))
{
    ::WaitForSingleObject(processInfo.hProcess, INFINITE);

    DWORD exit = 100;
    GetExitCodeProcess(processInfo.hProcess, &exit);

    CloseHandle(processInfo.hProcess);
    CloseHandle(processInfo.hThread);

    return exit;
}

Ao chamar CreateProcess (), ele consegue e entra no corpo do if. A chamada para WaitForSingleObject retorna imediatamente, o que não deve, como o processo deve demorar cerca de 20-30 segundos para terminar. E, finalmente, chamando GetExitCodeProcess () falhar e não definir o valor "exit".

FYI, este é o código que eu realmente utilizados em outros lugares com sucesso, não apenas em um serviço.

Pode ser que ele está sendo lançado a partir de um serviço e há problemas de permissões ??

Editar: Eu já percebi que ele vai realmente iniciar o aplicativo (que eu possa vê-lo em TaskMan), mas parece ser preso. É lá, mas não está fazendo nada.
Baseado em Rob Kennedy sugestão , eu corrigiu o problema identificador de processo, e ele realmente faz aguarde o processo ao fim. Mas ele nunca faz acabamento a menos que eu matá-lo manualmente.

Foi útil?

Solução

WaitForSingleObject e GetExitCodeProcess esperar o próprio identificador de processo, não um ponteiro para o identificador de processo. Retire os ampersands.

Além disso, verifique os valores de retorno e GetLastError chamada quando eles falham. Isso vai ajudá-lo a diagnosticar problemas futuros. Nunca assuma uma função API sempre terá êxito.

Uma vez que você chamar as funções certas, e os novos começos processo, mas não faz nenhum progresso, você pode estar razoavelmente certo de que este código não é o culpado. As mentiras problema no novo processo, de modo a concentrar as suas tarefas de depuração lá, não no processo de serviço.

Outras dicas

Após a atualização e editar, isso soa como uma das muitas armadilhas possíveis ao iniciar um processo de um serviço. Existe alguma possibilidade - qualquer que seja - que o seu processo externo está à espera de interação do usuário? Há três exemplos principais que eu posso pensar, um, por exemplo, seria um aplicativo de linha de comando que podem em algumas circunstâncias requerem a entrada do teclado (por exemplo, algo como "cmd / c del *. *" Exigiria a confirmação do usuário). Os outros exemplos seria aplicável se o aplicativo precisava de uma janela, e é exibi-lo, mas você não pode vê-lo. Se for esse o caso, você pode querer definir o serviço para "interagir com o desktop" durante a depuração, e, em seguida, ser capaz de ver qualquer janela do aplicativo (ou uma mensagem de erro do Windows inesperado, como ser incapaz de encontrar uma DLL ou similar).

Se isso ajuda você a depuração ou não, geralmente o "a-ha!" momento vem percebendo que as coisas tais como variáveis ??de ambiente, caminho, diretório atual, e assim por diante não são, talvez, o que você esperaria de dentro do seu serviço. As permissões não são o motivo mais comum para este tipo de problema. você poderia fornecer alguns detalhes sobre o aplicativo externo que você está tentando lançamento, talvez isso ajudaria a pensar isso.

Uma vez que você está lançando um aplicativo console, é possível que lá está escondido código de inicialização tentando inicializar um console. Um serviço não está ligado à área de trabalho, e tenho certeza que um processo iniciado pelo serviço não vai ser qualquer um, por isso não vai ser capaz de criar um console. Isso poderia ser o ponto onde ele está pendurado.

Se você puder, tente alterar o seu processo em um executável completa do Windows, mas pular a parte em que você tenta criar uma janela.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top