内存映射实现进程间通信

来源:互联网 发布:彩虹岛网络传输异常 编辑:程序博客网 时间:2024/06/07 13:03

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

//服务器部分代码void CServerDlg::OnCreateFileMap() {// TODO: Add your control notification handler code hereCButton* 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 hereCButton* 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 herem_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 hereif (m_pBaseMapFile) { UnmapViewOfFile(m_pBaseMapFile);  }if(m_hMapFile){CloseHandle(m_hMapFile);}}void CClientView::SetBitsToBmp(LPBYTE lpBase){BITMAPFILEHEADER *pFileHeader; // bitmap file-headerBITMAPINFO *pInfoHeader; // bitmap info-headerpFileHeader = (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 hereBitBlt(pDC->m_hDC,0, 0, m_nWidth, m_nHeight, m_hMemDC,0,0,SRCCOPY);}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 给学生讲错题了怎么办 高中作弊被通报怎么办 没收到电子发票怎么办 皇冠草叶子发黄怎么办 脚痒怎么办小窍门 孩子天天玩手机怎么办 征信大数据花了怎么办 衣服容易有水印怎么办? ps楷体有锯齿怎么办 报表打印需要jre怎么办 考试忘记写名字怎么办 ems明信片没收到怎么办 580escl解锁失败怎么办 留学回国人员证明怎么办 员工不签劳动合同怎么办 在日本怎么办韩国签证 在新疆怎么办英国签证 安徽省会考没过怎么办 初中要会考了怎么办 担保人卡被冻结怎么办 188a转永居失败怎么办 刷机忘了id密码怎么办 在澳大利亚怎么办白卡 外国的工作签证怎么办 北京去澳门怎么办签注 专科挂科毕业证怎么办 新西兰预科成绩不合格怎么办 私立转公立学籍怎么办 法国留学拒签怎么办 法国留学签证被拒怎么办 英国留学拒签怎么办 在普高出国怎么办 副高职称不让出国怎么办 没学位现场确认怎么办 香港master挂科怎么办 香港研究生挂科怎么办 加拿大研究生绩点刚合格怎么办 l2续签失败 学校怎么办 珍珠柏盆景黄叶怎么办 导师中途辞职了怎么办 信用卡额度满了怎么办