2009-09-16 17 views
7

Estoy intentando construir un servicio de Windows con MingW. Necesita excepciones de seguridad de subprocesos, por lo que agregué el indicador del enlazador -mthreads. La aplicación funciona bien desde la línea de comandos, pero cuando intento iniciarla desde services.msc, aparece el error 1054 ("El servicio no respondió a la solicitud de inicio o control de manera oportuna"). El servicio se inicia si lo vuelvo a construir sin el -mthreads. ¿Cómo puedo hacer que esto funcione con -mthreads?Servicio de Windows multiproceso en MingW

Respuesta

1

Me pregunto si puede depurarlo cuando se ejecuta como un servicio. Debe haber algo que espanta a su programa cuando el host del servicio lo ejecuta. Tal vez intente adjuntar un depurador a svchost.exe, al menos puede ver qué módulos están cargados y quizás qué excepción causa el bloqueo.

+0

La conexión de un depurador a svchost.exe no ayudó. El servicio no tiene la oportunidad de comenzar. El error se produce incluso antes de eso. –

1

¿Su aplicación incluso se está iniciando en absoluto? Llame al OutputDebugString (o su equivalente) al comienzo de su función main para ver si llega tan lejos. (Agarre DbgView desde SysInternals si no lo tiene ya)

Si no llega tan lejos, comenzamos a buscar lo obvio: ¿se trata de que la aplicación no encuentre el archivo DLL de tiempo de ejecución? Puede ser que tenga el tiempo de ejecución normal en su RUTA, pero no puede encontrar la versión MT. Eso podría explicar el comportamiento que describes. Es posible que deba copiar el tiempo de ejecución de MT o actualizar la RUTA en consecuencia.

+0

La aplicación ni siquiera se inicia. Pero se ejecuta desde la línea de comando. Por lo tanto, no puede ser el problema con las bibliotecas de tiempo de ejecución. –

+0

¿Dónde está la versión MT de las bibliotecas de tiempo de ejecución? Debe estar en el directorio de la aplicación. Quizás las bibliotecas de tiempo de ejecución estén disponibles en la RUTA cuando se ejecuta como su usuario, pero no como el sistema. Use depends.exe para rastrear de qué dll depende. También puede intentar ejecutar la aplicación como otro usuario. –

5

Sospecho que -mthreads está generando una dependencia en una DLL, y esa DLL no está en la ruta cuando se está ejecutando como un servicio. En mi entorno cygwin, si compilo un programa trivial con "-mno-cygwin -mthreads", obtengo una dependencia en MINGWM10.DLL, que ciertamente no estaría en la ruta cuando se ejecute como un servicio. Si intento ejecutarlo sin establecer PATH, se bloquea cuando comienza a cargarse (y deja un turd en el registro de eventos de la aplicación).

Me gustaría llamar a su exe en Dependency Walker (http://www.dependencywalker.com) para ver lo que está cargando en tiempo de carga, y consulte su registro de eventos de Windows para ver si hay alguna sugerencia allí. Probablemente necesite colocar una copia de las DLL que necesita junto con el ejecutable.

2

Necesita mingwm10.dll en el directorio de trabajo o en [edit: system, not per user] PATH, porque los programas de C++ compilados con la opción -mthread tienen esa dependencia. Si está bastante seguro de que su código nunca lanzará una excepción ni propagará a través de su pila, use -fno-exception en lugar de -mthread para resolver la dependencia.

Cuestiones relacionadas