1

我正在编写一个简单的 Windows 控制台 C++ 应用程序。如果应用程序第二次启动(在同一台计算机上),它不应该跨越一个新实例,而是将命令行参数传递给已经运行的实例。

我已经通过使用互斥锁确保应用程序仅在一个实例中运行,但我无法通知第一个应用程序它已作为第二次启动并传递命令行参数。

用例:
listener.exe -start// 启动监听
listener.exe -stop器 // 停止监听器

4

3 回答 3

3

如果您只想传达一个简单的布尔值(例如开始/停止),那么您可能需要一个Event 对象

如果你想在进程之间交换更复杂的数据,你可以使用命名管道或者共享内存块。

于 2013-04-02T11:46:05.480 回答
1

第一个侦听器应等待要关闭的事件对象。当您启动时listener.exe -stop,它只会将全局事件设置为关闭,如果第一个实例正在运行,那么它将退出。需要命名事件对象才能让其他进程引用它。此外,当您第二次触发命令时,它将启动另一个进程,没有带有命令解释器的隐式 IPC。

listener.exe -开始:

  1. 创建命名事件 (CreateEvent)

  2. 在主线程或任何合适的线程中等待事件。(等待单个对象)

  3. 事件启动关闭

listener.exe -停止

  1. 获取命名事件的句柄。
  2. 设置事件,使第一个进程的线程知道触发了关闭事件并退出

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

于 2013-04-02T11:42:22.183 回答
0

有许多类型的 IPC。在 Windows 上对我来说效果很好的一种技术是使用单独的线程来处理仅消息窗口的消息。一旦您确定您是程序的主要实例,或者侦听器(通过在您的场景中创建互斥锁)创建仅消息窗口并启动一个线程来处理消息。对于辅助实例,如果命令尾部有内容,则使用 WM_COPYDATA 消息将其作为字符串传递给仅消息窗口。侦听器程序忽略所有其他消息,除了可能告诉它退出的令牌。一旦辅助实例将消息传递到仅消息窗口,它就会退出。

这对于您可能有几十个辅助实例打开的情况非常有效。一个例子是用户在资源管理器文件夹中选择 50 个文件,右键单击并运行程序。侦听器在专用线程中处理仅消息窗口并将字符串(在本例中为文件名)排队以进行处理。

于 2016-01-29T13:11:10.120 回答