Comment puis-je utiliser correctement le WaitForSingleObject méthode attendre d'un programme externe pour mettre fin?
Je suis en train de lancer une application externe avec statut plus élevé, et d'attendre jusqu'à la sortie avant de poursuivre:
var
FProcess: THandle;
ExecInfo: TShellExecuteInfo;
begin
FillChar(ExecInfo, SizeOf(ExecInfo), 0);
with ExecInfo do
begin
cbSize := SizeOf(ExecInfo);
fMask := 0;
Wnd := AWindow;
lpVerb := 'runas';
lpFile := PChar(APath);
lpParameters := PChar(AParams);
lpDirectory := PChar(AWorkDir);
nShow := SW_NORMAL;
end;
Result := ShellExecuteEx(@ExecInfo);
if Wait then
begin
while WaitForSingleObject(ExecInfo.hProcess, INFINITE) <> WAIT_TIMEOUT do
Application.ProcessMessages;
end;
Ce lance, mais il ne cesse d'attente. Le programme appelant ne jamais se poursuit après l'appel à WaitForSingleObject, même après le programme des sorties.
J'ai essayé WAIT_OBJECT_0 au lieu de WAIT_TIMEOUT, mais j'ai le même problème. Ce que je fais mal?
Ce processus êtes-vous en train de s'exécuter? Êtes-vous sûr qu'il a réussi? Si oui, êtes-vous sûr que vous avez un descripteur valide? Il y a beaucoup de choses qui pourraient aller mal dans ce code avant de vous jamais arriver à la partie que vous souhaitez savoir. Assurez-vous de poser des questions sur la bonne chose. Et si la WaitForSingleObject retours d'appel, ce n'est pas de retour Wait_Timeout; de sorte que est - il de retour?
OriginalL'auteur croceldon | 2011-03-10
Vous devez vous connecter pour publier un commentaire.
Ce que le code
est censé faire? C'est une boucle infinie.
Utiliser juste
à la place. Et oui, vous avez besoin
pour obtenir le handle de processus.
OriginalL'auteur kludg
Votre code est cassé. Vous n'êtes pas en passant la
SEE_MASK_NOCLOSEPROCESS
drapeau àShellExecuteEx()
, de sorte qu'il ne retournera pas un processus valide la poignée vers vous, et votre boucle, c'est ignorer les erreurs quiWaitForSingleObject()
vous dit à cause de cela, si vous vous retrouvez dans une boucle sans fin.Essayez plutôt ceci:
ExitCode
de l'appelé processus avec cette méthode?Appel
GetExitCodeProcess()
après la boucle et avant de fermer le handle de processus.OriginalL'auteur Remy Lebeau
Si vous lisez description de ShellExecuteEx dans MSDN, vous verrez ceci:
I. e. vous n'avez pas un descripteur valide. Vous devez définir fMask comme écrit ci-dessus.
OriginalL'auteur Eugene Mayevski 'Allied Bits