进程间通信之共享内存

//写入端

//创建共享内存
void C写入端Dlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	//创建共享内存
	handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE|SEC_COMMIT, 0, DEF_DATA_SIZE, L"ShareMemSample");
	//映射共享内存
	if(handle)
	{
		lpData = MapViewOfFile(handle, FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, 0);
		::MessageBox(NULL, L"创建共享内存映射文件成功", L"消息", MB_OK);
	}
	else
	{
		::MessageBox(NULL, L"创建共享内存映射文件失败", L"消息", MB_OK);
	}
}
//关闭共享内存
void C写入端Dlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	//撤销映射的共享内存
	if(lpData)
	{
		UnmapViewOfFile(lpData);
	}
	//关闭共享内存
	if(handle)
	{
		CloseHandle(handle);
	}
}
//写数据到共享内存
void C写入端Dlg::OnBnClickedButton3()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(true);
	int iLen = data.GetLength()*2 +2;
	LPWSTR lpBuf = data.GetBuffer(iLen);
	//写入共享内存
	memcpy(lpData, lpBuf, iLen);
	HWND  hWnd = ::FindWindow(NULL, L"接收端");
	//通知到接收端
	if(hWnd)
	{
		::PostMessage(hWnd, SHARE_MEM_NOTIFY, 0, 0);
	}
}

//读取端

//重载PreTranslateMessage处理SHARE_MEM_NOTIFY数据更新通知消息
BOOL C接收端Dlg::PreTranslateMessage( MSG* pMsg )
{
	if(pMsg->message == SHARE_MEM_NOTIFY)
	{
		OnBnClickedButton1();
	}
	return CDialog::PreTranslateMessage(pMsg);
}
//从共享内存读取数据
void C接收端Dlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	//打开共享内存
	HANDLE hMapFile = OpenFileMapping(FILE_MAP_READ, false, L"ShareMemSample");
	if(hMapFile == NULL)
	{
		::MessageBox(NULL, L"打开共享内存失败", L"消息", MB_OK);
	
		return;
	}
	//映射共享内存
	LPVOID lpBase = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
	if(lpBase == NULL)
	{
		::MessageBox(NULL, L"打开共享内存映射文件失败", L"消息", MB_OK);
		return ;
	}
	//读取共享内存数据
	data.Format(L"%s", (LPWSTR)lpBase);
	UpdateData(false);
	//卸载映射的共享内存
	UnmapViewOfFile(lpBase);
	//关闭共享内存
	CloseHandle(hMapFile);
}


 C接收端Dlg.cpp 和 C发送端Dlg.cpp 中必须自定义消息#define SHARE_MEM_NOTIFY (WM_USER+1)。

发送端往共享内存里写好数据后,PostMessage(hWnd, SHARE_MEM_NOTIFY, 0, 0); hWnd是接收端窗口句柄,可以用FindWindow(NULL, L"接收端");获得。在接收端重写PreTranslateMessage处理SHARE_MEM_NOTIFY消息。

CreateFileMapping(),MapViewOfFile(),OpenFileMapping()对这个三函数的使用参照MSDN。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值