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;
	}
}

 

 

运行结果:

image

posted @ 2026-06-09 23:22  [BORUTO]  阅读(8)  评论(0)    收藏  举报