Pregunta

Estoy intentando iniciar otro proceso desde un servicio (es una aplicación de consola que recopila algunos datos y los escribe en el registro), pero por alguna razón no puedo hacer que se inicie correctamente.

Lo básico de lo que estoy tratando de hacer es lo siguiente:

  1. Iniciar el proceso
  2. Espere a que termine el proceso
  3. Recuperar el código de retorno del proceso

Actualmente estoy usando el siguiente 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;
}

Al llamar a CreateProcess (), tiene éxito e ingresa el cuerpo de la instrucción if. La llamada a WaitForSingleObject regresa de inmediato, lo cual no debería, ya que el proceso debería demorar aproximadamente 20-30 segundos en finalizar. Y, finalmente, llamar a GetExitCodeProcess () falla y no establece el valor " exit " ;.

Para su información, este es un código que realmente he usado en otro lugar con éxito, solo que no en un servicio.

¿Podría ser que se está iniciando desde un servicio y hay problemas de permisos?

Editar: ahora me he dado cuenta de que en realidad lanzará la aplicación (puedo verla en TaskMan) pero parece estar atascada. Está allí, pero no está haciendo nada.
Basado en la sugerencia de Rob Kennedy, arreglé el problema de manejo del proceso, y en realidad espera a que termine el proceso. Pero nunca termina a menos que lo mate manualmente.

¿Fue útil?

Solución

WaitForSingleObject y GetExitCodeProcess esperan el identificador del proceso en sí, no un puntero al identificador del proceso. Elimina los signos de unión.

Además, verifique los valores de retorno y llame a GetLastError cuando fallen. Eso lo ayudará a diagnosticar problemas futuros. Nunca suponga que una función API siempre tendrá éxito.

Una vez que llama a las funciones correctamente, y el nuevo proceso comienza pero no progresa, puede estar razonablemente seguro de que este código no es el culpable. El problema radica en el nuevo proceso, así que concentre sus tareas de depuración allí, no en el proceso de servicio.

Otros consejos

Después de la actualización y edición, esto suena como uno de los muchos problemas posibles al iniciar un proceso desde un servicio. ¿Existe alguna posibilidad, alguna, de que su proceso externo esté esperando la interacción del usuario? Hay tres ejemplos principales en los que puedo pensar, uno, por ejemplo, sería una aplicación de línea de comandos que en algunas circunstancias podría requerir la entrada del teclado (por ejemplo, algo como '' cmd / c del *. * '' Requeriría la confirmación del usuario) . Los otros ejemplos se aplicarían si la aplicación necesitara una ventana y la muestra, pero no puede verla. Si ese es el caso, es posible que desee configurar su servicio para "interactuar con el escritorio" durante la depuración, y luego poder ver la ventana de la aplicación (o un mensaje de error inesperado de Windows, como no poder encontrar un archivo DLL o similar).

Si esto le ayuda a depurar o no, generalmente el "a-ha!" llega el momento de darse cuenta de que cosas como las variables de entorno, la ruta, el directorio actual, etc., tal vez no sean lo que esperaría de su servicio. Los permisos no son la razón más común para este tipo de problema. ¿Podría proporcionar algunos detalles sobre la aplicación externa que está tratando de iniciar, tal vez eso ayudaría a pensar esto?

Dado que está iniciando una aplicación de consola, es posible que haya un código de inicio oculto que intenta inicializar una consola. Un servicio no está conectado al escritorio, y estoy seguro de que un proceso lanzado por el servicio tampoco lo estará, por lo que no podrá crear una consola. Ese podría ser el punto donde está colgando.

Si puede, intente cambiar su proceso a un ejecutable completo de Windows, pero omita la parte donde intenta crear una ventana.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top