Win32 进程间通信分配

Posted

技术标签:

【中文标题】Win32 进程间通信分配【英文标题】:Win32 Inter Process Communication Assignment 【发布时间】:2020-05-17 06:51:18 【问题描述】:

我需要做一个 C++ 作业,但我对 Win32 IPC 还是很陌生。 我昨天做了一些研究,但我找不到我要寻找的东西。

基本上,我需要两个程序,第一个用分页文件创建一个 FileMapping,等待一个缓冲区,显示缓冲区,然后关闭它。

第二个连接到通信通道,将缓冲区写入第一个程序,然后关闭。

我最接近的是这个资源: IPC Communication 但是那里的人使用管道而不是使用分页文件的通信通道。

另外,我发现我可以打开一个带有分页文件的 FileMapping,就像这样:

TCHAR szMapFileName[] = _T("Local\\HelloWorld"); 

HANDLE hMapFile = CreateFileMapping( 
       INVALID_HANDLE_VALUE,       

       NULL,                      // Default security 
       PAGE_READWRITE,            // Read/write access 
       0,                         // Max. object size 
       BUFFER_SIZE,               // Buffer size  
       szMapFileName              // Name of mapping object);

如果有人可以提供一些非常有价值的帮助(也许是应用程序的骨架?)。我昨天试图做一些研究,但徒劳无功。

谢谢

【问题讨论】:

Creating Named Shared Memory. 【参考方案1】:

CreateFileMapping()OpenFileMapping()MapViewOfFile() 确实是您需要调用的函数来分配共享内存缓冲区。

第一个应用必须:

创建文件映射。 创建一个同步对象,最好是一个事件,以等待它。 创建一个额外的线程,它将等待事件发出信号。在主 (UI) 线程中执行此操作会阻塞应用程序。 当事件发出信号时,将自定义消息 (WM_APP+nnn) 发布到主线程,以显示缓冲区的内容。 这是规范或设计的问题,在此之后要做什么,例如退出应用程序,只是不再等待缓冲区接收数据,清除事件并再次等待,等等。

第二个应用必须:

打开文件映射和事件。如果失败,则显示错误消息或警告并退出。 将数据写入共享内存缓冲区。 向事件发出信号。 退出。

可以进一步改进,例如,如果事件不处于非信号状态,第二个应用程序可能不会写入缓冲区。

【讨论】:

“创建一个额外的线程,它将等待事件发出信号。在主 (UI) 线程中执行此操作会阻塞应用程序。” - 不,并不真地。 MsgWaitForMultipleObjects 将无缝融入任何类型的应用程序,当有工作要做时从不阻塞,在没有工作时阻塞。

以上是关于Win32 进程间通信分配的主要内容,如果未能解决你的问题,请参考以下文章

与 Win32 服务的进程间通信

Win32 进程间通信的分析与比较(13种方法)

Win32 共享内存的包装类? (进程间通信)

Windows进程间共享内存通信实例

Windows进程间通信

VC++ 进程间的通信