2015-05-31 68 views
0

我有兩個應用程序。他們兩人使用相同的資源。讓我們稱這些資源爲「個人資料資源」。在應用程序A關閉之前,應用程序B無法啓動。所以我有應用程序A運行並試圖關閉它,然後啓動應用程序B路徑。我探索了RegisterApplicationRestart,但我無法完成。這是可能做到的嗎?我陷在其中,申請A是關閉的位置,然後我不能運行任何代碼,發動回到應用程序B.RegisterApplicationRestart與不同的路徑

+1

如果應用程序正常終止,'RegisterApplicationRestart'將不會執行重新啓動。它不是爲了這樣做而設計的。你有錯誤的功能。我的猜測是,App A和App B都是firefox.exe,所以你可能需要一個單獨的可執行文件。 –

+1

此外,如果應用程序異常終止或掛起,觸發重新啓動,將提示用戶是否實際執行重新啓動。僅當操作系統使用EWX_RESTARTAPPS標誌重新引導時,纔會自動重新註冊應用程序,例如由需要替換正在運行的應用程序上的文件的安裝程序。 –

+0

嗨@DavidHeffernan非常感謝yep我的用戶所做的是他們有firefox.exe和firefox_beta.exe和firefox_alpha.exe,然後是firefox_nightly.exe,他們正在運行firefox.exe點擊了一個按鈕重新啓動Firefox到Firefox _ ** *。可執行程序。目前我有一個目標設置爲firefox.exe的快捷方式文件,因此當他們將版本更改爲beta時,我更改了快捷方式的目標,然後我需要在關機後重新啓動該快捷方式。 – Noitidart

回答

1

A可以退出之前使用CreateProcess()推出B,通過它自己的進程句柄B。在B訪問資源之前,它可以使用WaitForSingleObject()或相關函數等待A的句柄。當手柄發信號時,A已完全終止,因此B可以使用CloseHandle()關閉手柄並根據需要繼續。

要傳遞A的處理句柄BA可以:

  1. 打開使用OpenProcess()它自己的進程手柄GetCurrentProcessId()進程ID,標記使用SetHandleInformation()手柄爲可繼承,再通將B的句柄值作爲命令行參數,將bInheritHandles參數CreateProcess()設置爲TRUE。

  2. 運行B第一,並將它創建一個IPC監聽器(命名管道,郵筒,插座等),然後A可以複製的B自己的進程句柄的通過DuplicateHandle()使用與GetCurrentProcess()作爲源手柄和B「 (從CreateProcess())作爲目標進程,然後通過IPC將重複句柄值發送到B

一種更簡單的技術是有A通過它自己的進程ID,而不是它的處理句柄,以B作爲命令行參數,然後B可以使用OpenProcess()打開A的處理句柄。雖然這通常會工作,但它有一個小的競爭條件 - B有機會打開進程句柄之前,A可能會終止與OS可以重用它的進程ID爲新的不相關的進程,從而B會得到一個句柄,並等待,錯誤的過程。

+0

謝謝@Remy!我會測試這個並報告ba CK!編輯:啊,我沒有控制應用程序B.只有應用程序A是我的,這仍然工作? – Noitidart

+1

是的,稍作修改。 'A'可以運行自己的另一個副本,可以等待原始文件退出,如上所述,然後再運行'B'。 ''A''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' –

+0

謝謝@Remy!將測試:) – Noitidart

相關問題