2013-04-02 12 views
1

正在寫一個簡單的Windows控制檯C++應用程序。如果應用程序第二次啓動(在同一臺計算機上),它不應該跨越新的實例,而是將命令行參數傳遞給已在運行的實例。確保單實例並傳遞Windows C++控制檯應用程序參數的正確方法

我已經完成了確保應用程序只通過使用互斥體運行在一個實例中,但我無法通知第一個應用程序它已經第二次啓動並傳遞命令行參數。

使用案例:
listener.exe -start //開始監聽
listener.exe -stop //停止監聽

+1

您可能正在尋找進程間通信IPC。 – dyp

+0

是的,使用IPC,如下所述,答案中沒有使用命令解釋程序的隱式支持,它將再次調用同一個正在運行的可執行程序的主程序。否則具有命名全局事件的IPC是簡單的解決方案 –

回答

1

第一個聽衆應該等待一個事件對象,它是關機的。當你啓動listener.exe -stop時,它只會設置關閉的全局事件,如果第一個實例正在運行,那麼它將退出。命名的事件對象是必需的,以便其他進程引用它。另外,當你第二次啓動命令時,它將啓動另一個進程,沒有隱式IPC和命令解釋器。

listener.exe -start:

  1. 創建一個名爲事件(CreateEvent)

  2. 等待上在主線程事件或任何合適的線程。 (WaitForSingleObject的)

  3. 在事件發起關機

listener.exe -stop

  1. 獲取處理來命名的事件。
  2. 設置事件,以便第一個進程的線程知道關機事件被觸發,它退出

一些參考: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686915(v=vs.85).aspx

3

如果你只是想傳達一個簡單的布爾值(Start /停止,例如),那麼你可能需要一個Event object

如果要在進程之間交換更復雜的數據,可以使用named pipes或者可能是共享內存塊。

0

IPC有很多種類型。在Windows上運行良好的一種技術是使用單獨的線程來處理僅消息窗口的消息。一旦你確定你是程序或監聽器的主要實例(通過在你的場景中創建互斥量)創建僅消息窗口並啓動一個線程來處理消息。對於輔助實例,如果命令尾部有某些內容,則使用WM_COPYDATA消息將其作爲字符串傳遞給僅消息窗口。偵聽器程序忽略所有其他消息,除了令牌可能退出。一旦輔助實例將消息傳遞給僅消息窗口,它將退出。

對於可能有數十個輔助實例打開的場景,這可以很好地工作。一個例子是用戶在資源管理器文件夾中選擇50個文件,右鍵單擊並運行該程序。偵聽器在專用線程中處理僅消息窗口,並將字符串排隊(在這種情況下是文件名)以進行處理。

相關問題