Domanda

Sto tentando di avviare un altro processo da un servizio (è un'app console che raccoglie alcuni dati e li scrive nel registro) ma per qualche motivo non riesco a avviarlo correttamente.

I concetti di base di ciò che sto cercando di fare sono i seguenti:

  1. Avvia il processo
  2. Attendi il completamento del processo
  3. Recupera il codice di ritorno dal processo

Attualmente sto usando il seguente codice:

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;
}

Dopo aver chiamato CreateProcess (), ha esito positivo ed entra nel corpo dell'istruzione if. La chiamata a WaitForSingleObject ritorna immediatamente, cosa che non dovrebbe, poiché il processo dovrebbe richiedere circa 20-30 secondi per terminare. Infine, la chiamata a GetExitCodeProcess () non riesce e non imposta il valore " exit " ;.

Cordiali saluti, questo è il codice che ho effettivamente usato altrove con successo, ma non in un servizio.

Potrebbe essere che viene avviato da un servizio e ci sono problemi di autorizzazioni ??

Modifica: ora ho capito che in realtà avvierà l'app (la vedo in TaskMan) ma sembra bloccata. È lì, ma non sta facendo nulla.
Sulla base del suggerimento di Rob Kennedy , ho risolto il problema di gestione dei processi e in realtà attende che il processo finisca. Ma non finisce mai se non lo uccido manualmente.

È stato utile?

Soluzione

WaitForSingleObject e GetExitCodeProcess prevedono che l'handle del processo stesso, non un puntatore all'handle del processo. Rimuovi le e commerciali.

Inoltre, controlla i valori di ritorno e chiama GetLastError quando falliscono. Ciò ti aiuterà a diagnosticare problemi futuri. Non dare mai per scontato che una funzione API abbia sempre successo.

Una volta chiamate correttamente le funzioni e il nuovo processo inizia ma non compie progressi, si può essere ragionevolmente certi che questo codice non sia il colpevole. Il problema sta nel nuovo processo, quindi focalizza le tue attività di debug lì, non nel processo di servizio.

Altri suggerimenti

Dopo l'aggiornamento e la modifica, questo suona come uno dei tanti possibili trucchi all'avvio di un processo da un servizio. C'è qualche possibilità, qualunque sia, che il tuo processo esterno sia in attesa dell'interazione dell'utente? Ci sono tre esempi principali a cui riesco a pensare, uno per esempio potrebbe essere un'applicazione da riga di comando che potrebbe in alcune circostanze richiedere l'immissione da tastiera (ad esempio, qualcosa come "quot cmd / c del *. *" Richiederebbe la conferma dell'utente) . Gli altri esempi si applicherebbero se l'applicazione avesse bisogno di una finestra e la visualizzi ma non la vedi. In tal caso, potresti voler impostare il servizio su " interagire con il desktop " durante il debug e quindi essere in grado di vedere la finestra dell'applicazione (o un messaggio di errore di Windows imprevisto come l'impossibilità di trovare una DLL o simile).

Se questo ti aiuta a eseguire il debug o meno, di solito il " a-ha! " il momento deriva dal rendersi conto che cose come variabili d'ambiente, percorso, directory corrente e così via non sono forse ciò che ti aspetteresti dal tuo servizio. Le autorizzazioni non sono la ragione più comune per questo tipo di problema. Potresti fornire alcuni dettagli sull'applicazione esterna che stai tentando di lanciare, forse ciò aiuterebbe a pensarlo.

Poiché stai avviando un'app console, è possibile che ci sia un codice di avvio nascosto che tenta di inizializzare una console. Un servizio non è collegato al desktop e sono sicuro che neanche un processo avviato dal servizio lo sarà, quindi non sarà in grado di creare una console. Questo potrebbe essere il punto in cui è sospeso.

Se puoi, prova a cambiare il tuo processo in un eseguibile di Windows completo, ma salta la parte in cui provi a creare una finestra.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top