2009-09-16 14 views
7

Sto cercando di costruire un servizio di Windows con MinGW. Ha bisogno di eccezioni thread-safe, quindi ho aggiunto il flag del linker -mthreads. L'applicazione funziona benissimo dalla linea di comando, ma quando provo ad avviarlo da services.msc, l'errore 1054 ("il servizio non ha risposto alla richiesta di avvio o controllo in modo tempestivo") è sollevata. Il servizio si avvia se lo ricostruisco senza il flag -mthreads. Come posso farlo funzionare con -mthreads?servizio multithread di Windows in MingW

risposta

1

Mi chiedo se è possibile eseguire il debug quando viene eseguito come un servizio. Deve esserci qualcosa che spaventa il tuo programma quando l'host del servizio lo esegue. Forse prova ad associare un debugger a svchost.exe, almeno puoi vedere quali moduli sono caricati e magari quale eccezione causa l'arresto anomalo.

+0

L'aggiunta di un debugger a svchost.exe non è stata di aiuto. Il servizio non ha la possibilità di iniziare. L'errore è stato lanciato ancor prima. –

1

è la vostra applicazione, anche in fase di avvio a tutti? Metti una chiamata a OutputDebugString (o equivalente) all'inizio della tua funzione main per vedere se arriva così lontano. (. Grab DbgView da SysInternals se non avete già)

Se non arrivare così lontano, abbiamo avviare il controllo per l'ovvio: si tratta di una questione di applicazione non trovare la DLL di runtime? Potrebbe essere che tu abbia il normale runtime nel suo PATH, ma non può trovare la versione MT. Questo potrebbe spiegare il comportamento che descrivi. Potrebbe essere necessario copiare il runtime MT o aggiornare di conseguenza il PERCORSO.

+0

L'applicazione non si avvia nemmeno. Ma viene eseguito dalla riga di comando. Quindi non può essere il problema con le librerie di runtime. –

+0

Dove si trova la versione MT delle librerie di runtime? Dovrebbe essere nella directory dell'applicazione. Forse le librerie di runtime sono disponibili nel PERCORSO quando si esegue come utente, ma non come sistema. Usa depends.exe per rintracciare quale dll stai dipendendo. Potresti anche provare a eseguire l'app come un altro utente. –

5

I sospetti -mthreads sta portando una dipendenza su una DLL e che la DLL non si trova sul percorso quando è in esecuzione come servizio. Nel mio ambiente cygwin, se compilo un programma banale con "-mno-cygwin -mthreads", ottengo una dipendenza da MINGWM10.DLL, che certamente non sarebbe sul percorso quando è in esecuzione come servizio. Se provo a eseguirlo senza alcun set PATH, si blocca quando inizia a caricare (e lascia un turd nel registro eventi dell'applicazione).

Mi piacerebbe portare in Exe in Dependency Walker (http://www.dependencywalker.com) per vedere cosa si sta caricando in fase di caricamento, e controllare il registro eventi di Windows per vedere se ci sono suggerimenti lì. Probabilmente avrai bisogno di mettere una copia delle DLL di cui ha bisogno accanto all'eseguibile.

2

È necessario mingwm10.dll nella directory di lavoro o in [modifica: sistema, non per utente] PERCORSO, poiché i programmi C++ compilati con l'opzione -mthread hanno tale dipendenza. Se sei abbastanza sicuro che l'eccezione non verrà mai generata dal tuo codice né propagata attraverso lo stack, usa -fno-exception anziché -mthread per risolvere la dipendenza.