Win32 - 进程间通信(IPC)邮槽
邮槽是一种基于文件的通信机制,通过创建一个具有唯一名称的邮槽对象,进程可以向该邮槽写入消息,而其他进程可以从该邮槽读取消息。邮槽支持广播方式,即多个进程都可以从同一个邮槽读取相同的消息。需要注意的是,邮槽是单向的,只支持从邮槽中读取消息或者向邮槽写入消息,不能同时进行读写操作。此外,邮槽只能用于同一台计算机上的进程间通信,不能用于跨网络的通信。 邮槽是一种简单而可靠的进程间通信机制,适用于需要在同一台计算机上的多个进程之间传递消息的场景。使用邮槽可以实现进程之间的解耦和异步通信,提高系统的可扩展性和响应性。
邮槽服务器:
初始化邮槽
BOOL CMailSlotDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
//创建油槽
//第一个参数:名字
//第二个参数:最大消息的最大大小
//第三个参数:超时时间
//第四个参数:安全属性
m_hMailSlot=CreateMailslot(L"\\\\.\\mailslot\\test", 0, MAILSLOT_WAIT_FOREVER, NULL);
if (m_hMailSlot == INVALID_HANDLE_VALUE)
{
MessageBox(L"创建邮槽失败");
return TRUE;
}
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
//读取
void CMailSlotDlg::OnBnClickedBtnRead()
{
wchar_t buffer[100] = { 0 };
DWORD dwRead=0;
//第一个参数:窗口句柄
//第二个参数:数据缓存
//第三个参数:读取的大小
//第四个参数:实际读了多少
//第五个参数:溢出量
if (!ReadFile(m_hMailSlot, buffer, sizeof(buffer), &dwRead, NULL))
{
MessageBox(L"读取数据失败");
return;
}
MessageBox(buffer);
}
邮槽客户端:
void CMailSlotClientDlg::OnBnClickedBtnWrite()
{
HANDLE hMainSlot=CreateFile(L"\\\\.\\mailslot\\test", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hMainSlot == INVALID_HANDLE_VALUE)
{
MessageBox(L"打开邮槽失败");
return;
}
wchar_t buffer[100] = L"邮槽客户端";
DWORD dwWrite = 0;
if (!WriteFile(hMainSlot, buffer, wcslen(buffer) * 2 + 1, &dwWrite, NULL))
{
MessageBox(L"写入数据失败");
return;
}
}
运行结果:


浙公网安备 33010602011771号