Question

J'essaie de lancer un autre processus à partir d'un service (c'est une application pour console qui collecte des données et les écrit dans le registre), mais pour une raison quelconque, je ne parviens pas à le lancer correctement.

Les bases de ce que je suis en train d'essayer de faire sont les suivantes:

  1. Lancer le processus
  2. Attendez la fin du processus
  3. Récupérez le code de retour du processus

J'utilise actuellement le code suivant:

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

Lorsqu’il appelle CreateProcess (), il réussit et entre dans le corps de l’instruction if. L'appel à WaitForSingleObject est renvoyé immédiatement, ce qui ne devrait pas être le cas, car le processus devrait durer environ 20 à 30 secondes. Enfin, l'appel de GetExitCodeProcess () échoue et ne définit pas la valeur "exit".

Pour info, c’est du code que j’ai utilisé avec succès ailleurs, mais pas dans un service.

Est-il possible qu'il soit lancé à partir d'un service et qu'il existe des problèmes d'autorisations?

Modifier: : je viens de me rendre compte que l'application sera effectivement lancée (je le vois dans TaskMan), mais elle semble bloquée. C'est là, mais ne fait rien.
Sur la suggestion de Rob Kennedy, j'ai résolu le problème de traitement du processus, et il attend en fait que le processus se termine. Mais cela ne finit jamais que si je le tue manuellement.

Était-ce utile?

La solution

WaitForSingleObject et GetExitCodeProcess attendent le descripteur de processus lui-même, pas un pointeur sur le descripteur de processus. Retirez les esperluettes.

Vérifiez également les valeurs de retour et appelez GetLastError lorsqu'elles échouent. Cela vous aidera à diagnostiquer les problèmes futurs. Ne supposez jamais qu'une fonction API réussira toujours.

Une fois que vous appelez les fonctions correctement et que le nouveau processus commence mais ne progresse pas, vous pouvez être raisonnablement certain que ce code n’est pas le coupable. Le problème réside dans le nouveau processus, donc concentrez-y vos tâches de débogage et non sur le processus de service.

Autres conseils

Après la mise à jour et l'édition, cela ressemble à l'un des nombreux pièges possibles lors du lancement d'un processus à partir d'un service. Existe-t-il une possibilité - quelle qu'elle soit - que votre processus externe attende une interaction de l'utilisateur? Il existe trois exemples principaux auxquels je peux penser, par exemple une application en ligne de commande qui pourrait dans certaines circonstances nécessiter une saisie au clavier (par exemple, quelque chose comme "cmd / c del *. *" Nécessiterait une confirmation de l'utilisateur). . Les autres exemples s’appliqueraient si l’application avait besoin d’une fenêtre et l’affiche mais que vous ne la voyez pas. Si tel est le cas, vous pouvez configurer votre service pour "interagir avec le bureau". Pendant le débogage, vous pourrez alors voir la fenêtre de l'application (ou un message d'erreur Windows inattendu, tel que l'impossibilité de trouver une DLL ou similaire).

Si cela vous aide à déboguer ou non, généralement le "a-ha!" moment vient de réaliser que des choses telles que les variables d’environnement, le chemin, le répertoire courant, etc. Les autorisations ne sont pas la raison la plus courante de ce type de problème. Pourriez-vous fournir des détails sur l’application externe que vous essayez de lancer, cela vous aiderait peut-être à y penser.

Étant donné que vous lancez une application de console, il est possible que du code de démarrage caché tente d'initialiser une console. Un service n'est pas attaché au bureau et je suis sûr qu'un processus lancé par le service ne le sera pas non plus, il ne pourra donc pas créer de console. Cela pourrait être le point où il est suspendu.

Si vous le pouvez, essayez de transformer votre processus en un exécutable Windows complet, mais en ignorant la partie où vous essayez de créer une fenêtre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top