C++ 如何在windows服务和进程之间使用命名互斥和共享内存?

C++ 如何在windows服务和进程之间使用命名互斥和共享内存?,c++,windows-services,C++,Windows Services,我有一个用C++\MFC编写的代码,作为Windows服务和(正常的)C++\MFC Windows进程运行-现在我希望使用命名互斥和共享内存(文件映射)在两者之间进行通信 这怎么可能呢?这取决于您的沟通要求。通常,该服务创建互斥锁和共享内存,客户端打开它们并执行一些操作。OutputDebugString()是IPC使用互斥和共享内存(以及一些事件)的经典示例。OutputDebugString()的工作原理;你也可以做类似的事情。这取决于你的沟通需求。通常,该服务创建互斥锁和共享内存,客户端

我有一个用C++\MFC编写的代码,作为Windows服务和(正常的)C++\MFC Windows进程运行-现在我希望使用命名互斥和共享内存(文件映射)在两者之间进行通信


这怎么可能呢?

这取决于您的沟通要求。通常,该服务创建互斥锁和共享内存,客户端打开它们并执行一些操作。OutputDebugString()是IPC使用互斥和共享内存(以及一些事件)的经典示例。OutputDebugString()的工作原理;你也可以做类似的事情。

这取决于你的沟通需求。通常,该服务创建互斥锁和共享内存,客户端打开它们并执行一些操作。OutputDebugString()是IPC使用互斥和共享内存(以及一些事件)的经典示例。OutputDebugString()的工作原理;你也可以做类似的事情。

我建议如下

  • 服务创建一个互斥锁、2个事件和一个内存映射文件(m.m.f),所有这些文件都命名为

  • 当服务必须向其他进程发送数据时

    a。取得互斥对象的所有权

    b。将数据写入m.m.f

    c。向事件#1发送信号,这意味着该服务具有该程序的新信息

    d。释放互斥锁

  • 当程序想要向服务发送数据时

    a。取得互斥对象的所有权

    b。将数据写入m.m.f

    c。向事件#2发送信号,这意味着程序具有服务的新信息

    d。释放互斥锁

  • 服务检查事件2是否开启。如果不是继续做自己的事情,否则:

    a。获得m.m.f.的所有权

    b。读取数据

    c。重置事件#2

    d。释放互斥

  • 程序检查事件#1是否开启。如果不是继续做自己的事情,否则:

    a。获得m.m.f.的所有权

    b。读取数据

    c。重置事件#1

    d。释放互斥文本

  • 这种方法的问题是消息可能会丢失(例如,当服务在程序可以读取第一条消息之前设法在一行中写入两条消息时),并且只有一个进程可以将自身附加到服务(您必须确保)

    如果可能的话,我建议使用一种基于套接字的解决方案来解决这些问题


    另外,您可以使用m.m.f进行某种排队,以避免第一个问题

    我建议如下

  • 服务创建一个互斥锁、2个事件和一个内存映射文件(m.m.f),所有这些文件都命名为

  • 当服务必须向其他进程发送数据时

    a。取得互斥对象的所有权

    b。将数据写入m.m.f

    c。向事件#1发送信号,这意味着该服务具有该程序的新信息

    d。释放互斥锁

  • 当程序想要向服务发送数据时

    a。取得互斥对象的所有权

    b。将数据写入m.m.f

    c。向事件#2发送信号,这意味着程序具有服务的新信息

    d。释放互斥锁

  • 服务检查事件2是否开启。如果不是继续做自己的事情,否则:

    a。获得m.m.f.的所有权

    b。读取数据

    c。重置事件#2

    d。释放互斥

  • 程序检查事件#1是否开启。如果不是继续做自己的事情,否则:

    a。获得m.m.f.的所有权

    b。读取数据

    c。重置事件#1

    d。释放互斥文本

  • 这种方法的问题是消息可能会丢失(例如,当服务在程序可以读取第一条消息之前设法在一行中写入两条消息时),并且只有一个进程可以将自身附加到服务(您必须确保)

    如果可能的话,我建议使用一种基于套接字的解决方案来解决这些问题

    另外,您可以使用m.m.f进行某种排队,以避免第一个问题