内存映射实现进程间通信

示例通过内存映射实现从服务器加载bmp位图到内存,客户端从内存读取并显示。

//服务器部分代码
void CServerDlg::OnCreateFileMap() 
{
	// TODO: Add your control notification handler code here
	CButton* pButton = (CButton*)GetDlgItem(IDC_BUTTON1);
	pButton->EnableWindow(false);
	CString filename = _T("image\\3.bmp");
	//1.加载文件
	m_hFile = CreateFile(filename,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if (m_hFile == INVALID_HANDLE_VALUE)
	{
		MessageBox(_T("文件加载失败!!!"),NULL,MB_OK);
		return;
	}
	m_hMap = CreateFileMapping(m_hFile, NULL, PAGE_READONLY, NULL, NULL, _T("myjpg"));
	//2.映射整个文件到
	m_pBaseMapFile = MapViewOfFile(m_hMap,FILE_MAP_READ,0,0,0);
}

void CServerDlg::OnCloseFileMap() 
{
	// TODO: Add your control notification handler code here
	CButton* pButton = (CButton*)GetDlgItem(IDC_BUTTON2);
	pButton->EnableWindow(false);
	if (m_pBaseMapFile)
	{
		UnmapViewOfFile(m_pBaseMapFile);
	}
	if (m_hMap)
	{
		CloseHandle(m_hMap);
	}
	if (m_hFile)
	{
		CloseHandle(m_hFile);
	}
}

//客户端部分代码

void CClientView::OnOpenFileMap() 
{
	// TODO: Add your command handler code here
	m_hMapFile =OpenFileMapping(FILE_MAP_READ, FALSE,_T("myjpg"));
	if(m_hMapFile == NULL)
	{
		MessageBox(_T("文件映射打开失败!"));
		return;
	}
	m_pBaseMapFile=MapViewOfFile(m_hMapFile, FILE_MAP_READ, 0,0,0);
	
	SetBitsToBmp((BYTE*)m_pBaseMapFile);
}

void CClientView::OnCloseFileMap() 
{
	// TODO: Add your command handler code here
	if (m_pBaseMapFile) 
	{ 
		UnmapViewOfFile(m_pBaseMapFile);  
	}
	if(m_hMapFile)
	{
		CloseHandle(m_hMapFile);
	}
}

void CClientView::SetBitsToBmp(LPBYTE lpBase)
{
	BITMAPFILEHEADER *pFileHeader; // bitmap file-header
	BITMAPINFO *pInfoHeader; // bitmap info-header
	pFileHeader = (BITMAPFILEHEADER*)lpBase;
	if(pFileHeader->bfType != MAKEWORD('B', 'M'))
	{ 
		MessageBox(_T("本程序仅读取BMP 文件!"));
		::UnmapViewOfFile(lpBase);
		::CloseHandle(m_hMapFile);
		return;
	}
	BYTE *pBits = (BYTE*)lpBase + pFileHeader->bfOffBits;
	pInfoHeader = (BITMAPINFO*)((BYTE*)lpBase + sizeof(BITMAPFILEHEADER));
	m_nHeight = pInfoHeader->bmiHeader.biHeight;
	m_nWidth = pInfoHeader->bmiHeader.biWidth;

	CClientDC dc(this);

	// 创建一个与指定DC 兼容的未初始化的位图,选入到内存兼容DC 中
	m_hMemDC = CreateCompatibleDC(dc);
	HBITMAP hBitmap = ::CreateCompatibleBitmap(dc, m_nWidth, m_nHeight);
	::SelectObject(m_hMemDC, hBitmap);
	
	//1.正常显示
	SetDIBitsToDevice(m_hMemDC,0, 0, m_nWidth,m_nHeight,0, 0,0, m_nHeight, pBits, pInfoHeader,DIB_RGB_COLORS); 
	
	//2.缩放模式
	/*RECT rc;
	GetClientRect(&rc);
	int nWidth = rc.right - rc.left;
	int nHeight = rc.bottom - rc.top;
	StretchDIBits(m_hMemDC, 0, 0, nWidth, nHeight, 0, 0, m_nWidth, m_nHeight, pBits, pInfoHeader,DIB_RGB_COLORS,SRCCOPY);*/
	
	InvalidateRect(NULL, TRUE);
	::DeleteObject(hBitmap);
}

void CClientView::OnDraw(CDC* pDC)
{
	CClientDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	BitBlt(pDC->m_hDC,0, 0, m_nWidth, m_nHeight, m_hMemDC,0,0,SRCCOPY);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值