2010-07-28 12 views
1

J'ai une application utilitaire existante, appelons-la util.exe. C'est un outil de ligne de commande qui prend des entrées de la ligne de commande, et crée un fichier sur le disque, disons un fichier imageExécution d'un processus en tant qu'opération synchrone à partir d'une application Win32

Je veux l'utiliser dans une autre application, en exécutant util.exe. Cependant, il doit être synchrone de sorte que le fichier est connu pour exister lorsque le traitement se poursuit.

par exemple (psudeo)

bool CreateImageFile(params) 
{ 
    //ret is util.exe program exit code 
    int ret = runprocess("util.exe",params); 
    return ret==0; 
} 

Y at-il un seul appel API Win32 qui exécutera le processus et attendre jusqu'à ce qu'il se termine? J'ai regardé CreateProcess mais il retourne dès qu'il essaye de commencer, j'ai regardé ShellExecute mais cela semble un peu moche même si étaient synchrones.

+0

vous répondez déjà à votre propre question en mentionnant ShellExecute ... – YeenFei

+0

peu moche cependant, n'est ce pas? De plus, je ne suis pas sûr d'avoir récupéré le code retour de mon programme, j'ai obtenu une valeur aléatoire de 42 quand je l'ai essayé :) –

Répondre

3

Il n'y a pas une seule API, mais c'est en fait une question générale plus intéressante pour les applications Win32. Vous pouvez utiliser CreateProcess ou ShellExecuteEx et WaitForSingleObject sur le descripteur de processus. GetExitCodeProcess à ce stade vous donnera le code de sortie du programme. Voir here pour un simple exemple de code. Cependant, cela bloque complètement votre thread principal et peut vous causer de graves problèmes de blocage dans certains scénarios de messagerie Win32. Disons que l'exe engendré fait un message sendmessage. Il ne peut pas continuer tant que toutes les fenêtres n'ont pas traité le message, mais vous ne pouvez pas continuer car vous êtes bloqué en attente. Impasse. Puisque vous utilisez des programmes purement en ligne de commande, ce problème ne s'applique probablement pas à vous. Est-ce que vous vous souciez si un programme de ligne de commande se bloque pendant un moment?

La meilleure solution générale pour les applications normales est probablement de fractionner un processus de lancement et d'attente sur un thread et de poster un message dans votre fenêtre principale lorsque le thread est exécuté. Lorsque vous recevez le message, vous savez qu'il est sûr de continuer, et il n'y a aucun problème de blocage.

1

La poignée de traitement est un objet attendu, AFAIK. C'est exactement ce dont vous avez besoin.

Cependant, je recommande de ne rien faire de pareil. Le processus de démarrage sur les fenêtres peut être lent et il va bloquer votre interface utilisateur. Considérez une boucle PeekMessage avec des délais d'attente de 50 ms pour le faire à partir d'une application Windows.

+0

http://support.microsoft.com/kb/125212 cela m'a troublé. Je vois quelques endroits en ligne en utilisant WaitForSingleObject mais cette page dit que ça ne marche plus; ou est-ce que _only_ parle de spawning 16 bits exe en 32bit? –

+0

Comment une boucle de messages aide-t-elle? Je dois encore générer le processus d'une façon ou d'une autre? En outre, si le point entier est mon application fait une pause pendant que le fichier est généré, il devrait être autorisé à bloquer? –

+0

La création du processus sous Windows peut être lente mais n'est probablement pas comparable à la durée de fin du processus. Donc, ce n'est pas où mettre CreateProcess() qui est critique ici, mais WaitForSingleObject(). En tout cas, écrivez-vous une application graphique ou une console? (Bien sûr, OK pour bloquer une application de console simple et séquentielle) –