comment mettre fin à un processus créé par la fonction CreateProcess()?
J'ai créé un processus à l'aide de CreateProcess()
. C'est le code:
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
result = CreateProcess("C:\\AP\\DatabaseBase\\dbntsrv.exe", NULL, NULL, NULL, FALSE, 0, NULL, "C:\\ADP\\SQLBase", &si, &pi)
Comment puis-je obtenir la Poignée et processId de ce processus? Et finalement l'utiliser pour fermer ce processus?
Merci.
Ce que la fenêtre s'ouvre lorsque vous démarrez
Ce n'est pas vraiment une fenêtre de console comme oracle 10g ou cmd pour cette question. Vous ne pouvez pas d'entrée/sortie. C'est juste une fenêtre qui s'ouvre lorsque le serveur est démarré
Mise à jour de réponse.
dbntsrv.exe
? Est-ce une fenêtre de console?Ce n'est pas vraiment une fenêtre de console comme oracle 10g ou cmd pour cette question. Vous ne pouvez pas d'entrée/sortie. C'est juste une fenêtre qui s'ouvre lorsque le serveur est démarré
Mise à jour de réponse.
OriginalL'auteur digvijay | 2012-02-24
Vous devez vous connecter pour publier un commentaire.
De la struct
pi
, vous bénéficiez de:Le premier paramètre est le handle du processus.
Vous pouvez utiliser la poignée à la fin du processus:
OriginalL'auteur
Une poignée pour le processus est retourné dans la PROCESS_INFORMATION structure,
pi
variable.La TerminateProcess() fonction peut être utilisée pour interrompre le processus. Cependant, vous devez vous demander pourquoi vous avez besoin de tuer le processus et pourquoi un arrêt normal n'est pas possible.
Remarque: vous devez définir le
cb
membre desi
avant d'appelerCreateProcess()
:EDIT:
Pour supprimer la fenêtre de la console de spécifier
CREATE_NO_WINDOW
, comme le création du drapeau (le sixième argument) dans leCreateProcess()
appel.EDIT (2):
Pour supprimer la fenêtre, essayez de régler les membres suivants de STARTUPINFO structure avant de faire appel à
CreateProcess()
:Il s'ouvre une fenêtre.. C'était inattendu!!
mise à jour de la réponse à la deuxième approche de la suppression de la fenêtre. Fait-il réussir?
Il a travaillé.. Super!! Je Vous remercie beaucoup..
OriginalL'auteur
C'est l'a expliqué en détail dans MSDN:
Si le résultat est non nul (ce qui signifie qu'il a réussi), vous obtiendrez la poignée et processid dans le
pi
de la structure.Afin de tuer le processus, vous pouvez utiliser TerminateProcess
OriginalL'auteur
piProcessInfo.hProcess
est le handle du processus.Après que (
time_in_ms
), le processus sera fermé.TerminateProcess()
n'). Cependant, vous voudrez peut-être ajouter un texte expliquant que 😉Ce code ne fait pas résilier le processus de l'enfant, il attend sa fin.
dbntsrv.exe dans la fonction createprocess() démarre un serveur, ce processus ouvre également une fenêtre.. Après avoir essayé ce code, la fenêtre reste tel qu'il est.. Comment puis-je fermer la fenêtre qu'il ouvre??
OriginalL'auteur
De clôture le processus proprement
Pour fermer le processus proprement, vous devez envoyer une étroite premier signal:
Comment mettre fin à une Application "Proprement" dans Win32.
Voir cette réponse pour le code.
La terminaison du processus
Si vous ne se soucient pas d'arrêt, vous pouvez utiliser
TerminateProcess()
. Cependant, il est important de noter queTerminateProcess()
est asynchrone; il initie de résiliation et retourne immédiatement. Si vous avez besoin d'être sûr que le processus s'est terminé, appelez leWaitForSingleObject()
fonction avec une poignée pour le processus.Pas de clôture, il suffit d'attendre jusqu'à la fin de
Si le processus se terminera sur son propre, au lieu de s'arrêter, vous pouvez attendre jusqu'à ce qu'il ait fini.
OriginalL'auteur