2010-11-17 143 views
3

我正在使用MSVS 2008.我正在用c編寫一個應用程序,並想知道在Windows中重新啓動應用程序的最佳方式是什麼。如何重新啓動在Windows中編寫的控制檯c應用程序?

我環顧四周,有人正在做這樣的事情,但我不確定這是否是最好的方式,或者如果這甚至創造了一個全新的過程。

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

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

感謝

+0

所以,你只是想在一個命令窗口中反覆運行該程序,或者是否有某些我錯過的東西?每次都有相同的命令窗口還是不同的命令窗口? – nategoose 2010-11-17 21:26:02

+0

實際上程序將通過HTTP與服務器進行通信。程序將接收來自服務器的命令,其中一個命令可能是「重新啓動」命令。當它發生時,它將不得不關閉並重新啓動。最終可能沒有命令窗口,只是像服務一樣運行。重新啓動的原因是可能有新版本的應用程序。 – emge 2010-11-17 22:37:41

+1

不要忘記使用'argv [0]'作爲應用程序名稱。您也可以使用'system(char *)'來調用應用程序。 – mikek3332002 2010-11-17 23:00:39

回答

0

簡短的回答:看起來沒給我,但如果你綁定到插座,有一個非常小的機會父退出之前,你的兩個程序可能會發生衝突()秒。

恐怕要求「最好」的方式會產生一個「這是上下文相關」的答覆。

首先,根據WinExec上的MSDN docs,「此功能僅用於與16位Windows兼容,應用程序應使用CreateProcess功能」。這意味着它是一個類似'exec'函數的dos時代函數包裝器。當然,CreateProcess只是MS創建的某種怪物,但如果這個應用程序將非常重要,那麼可能應該採取建議。有趣的是,MS在文檔中提到了CreatProcess,「關閉進程的首選方法是使用ExitProcess函數」。

所以你可以看到,像這麼多問題一樣,有很多解決方案。回答這個問題的答案可能是:

  • 你關心 平臺獨立嗎?
  • 你關心安全嗎?
  • 你在乎這個 程序應該花費多少精力?

我希望可以幫助你!

+0

感謝您的回覆。我想我只是在尋找其他方法來做到這一點。我從來沒有在Windows中做過這個,只有在fork中使用fork()和exec()。爲了回答你的問題,我不關心平臺獨立性,這隻會在Windows上運行。我關心安全。至於多少努力,這是一個長期的項目(幾個月),但這只是整個項目的一小部分。 – emge 2010-11-17 23:43:21

0

下面是關於如何啓動計算器的一些愚蠢的例子。

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

startUpInfo.cb = sizeof(startUpInfo);

而(1)
{
的CreateProcess(L 「C:\ Windows \ System32下\ CALC.EXE」,NULL,NULL,NULL,FALSE,0,NULL,NULL,& STARTUPINFO,& procinfo)來查看;

WaitForSingleObject(procInfo.hProcess,INFINITE);
}

正如你所看到的,這將啓動一個新的進程「calc.exe」。它將等待它終止,並重新開始。請繼續關注我在這裏沒有關閉任何手柄!

1

您必須爲此額外增加一個進程。

從您的應用程序中,您將啓動該過程。它會等待你的主應用程序退出,然後等待它發生的任何事情(更新,...),然後重新啓動它自己。

從內部啓動應用程序將不會正常,因爲您將無法更新任何內容。