2010-11-17 6 views
3

J'utilise MSVS 2008. J'écris une application en c, et je voudrais savoir quelle est la meilleure façon de redémarrer une application dans Windows. J'ai regardé autour et quelqu'un faisait quelque chose comme ça, mais je ne suis pas sûr que ce soit la meilleure façon ou si cela crée même un tout nouveau processus.Comment faire pour redémarrer une console c application écrite dans Windows?

if(command == restart) 
    { 
     printf("program exiting!\n"); 
     Sleep(2000); 
     system("cls"); 

     WinExec("my_app.exe", SW_SHOW); 
     exit(0); 
    } 

Merci

+0

Alors vous voulez juste exécuter le programme encore et encore dans une fenêtre de commande ou y a-t-il quelque chose qui me manque? La même fenêtre de commande à chaque fois ou différente? – nategoose

+0

effectivement le programme communiquera avec un serveur via HTTP. Le programme recevra des commandes du serveur, une de ces commandes pourrait être une commande "restart". Quand c'est le cas, il devra se fermer et redémarrer lui-même. Finalement, il pourrait ne pas y avoir une fenêtre de commande, et juste courir comme un service. Une raison pour un redémarrage est que peut-être il y a une nouvelle version de l'application. – emge

+1

N'oubliez pas d'utiliser 'argv [0]' pour le nom de l'application. Vous pouvez également utiliser 'system (char *)' pour appeler l'application à la place. – mikek3332002

Répondre

0

Réponse courte: ok pour moi Looks, mais si vous lier à des prises, il y a vraiment peu de chance vos deux programmes pourraient entrer en collision avant la sortie de parent() s. Je crains que demander le «meilleur» ne produise une de ces réponses «dépendantes du contexte». Pour commencer, selon le MSDN docs sur WinExec, "Cette fonction est fournie uniquement pour la compatibilité avec Windows 16 bits Les applications doivent utiliser la fonction CreateProcess". Cela implique qu'il s'agit d'un wrapper de fonction DOS-era pour une fonction similaire à 'exec'. Bien sûr, CreateProcess est une sorte de monstre que MS créerait, mais si cette application est importante, le conseil devrait probablement être pris. Il est intéressant de noter que MS mentionne dans les documents pour CreatProcess que "la façon préférée d'arrêter un processus est d'utiliser la fonction ExitProcess".

Donc, vous pouvez voir, comme avec autant de problèmes, il existe de nombreuses solutions. Les questions à répondre qui pourraient aiguiser les réponses ici seraient:

  • Est-ce que vous vous souciez de plate-forme-indépendance?
  • Vous souciez-vous de la sécurité?
  • Considérez-vous combien d'efforts ce programme est supposé prendre?

etc.

J'espère que vous aide!

+0

Merci pour la réponse. Je suppose que je cherche juste d'autres façons de le faire. Je n'ai jamais fait cela sous Windows, seulement sous Linux avec fork() et exec(). Pour répondre à vos questions, je ne me soucie pas de l'indépendance de la plate-forme, cela ne fonctionnera que dans Windows. Je me soucie de la sécurité. En ce qui concerne les efforts, il s'agit d'un long projet (plusieurs mois), mais ce n'est qu'une infime partie du projet. – emge

0

Voici un exemple stupide sur la façon de démarrer la calculatrice.

STARTUPINFO startUpInfo = {0};
PROCESS_INFORMATION procInfo = {0};

startUpInfo.cb = taille de (startUpInfo);

while (1) {

CreateProcess (L "C: \ Windows \ system32 \ calc.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, & STARTUPINFO, & procinfo);

WaitForSingleObject (procInfo.hProcess, INFINITE); Comme vous pouvez le voir, cela va lancer un nouveau processus "calc.exe". Il attendra qu'il se termine et recommence tout à nouveau. Gardez à l'esprit que je n'ai pas fermé de poignées ici !!!

1

Vous devrez avoir un processus supplémentaire pour cela.

À partir de votre application, vous allez lancer ce processus. Il attendra que votre application principale sorte, attendra tout ce qui doit arriver (mise à jour, ...), puis redémarrera en se suicidant.

Le démarrage de l'application à partir de l'intérieur ne sera pas correct car vous ne pourrez rien mettre à jour.

Questions connexes