进程间通信——内存映射
进程1的数据有时需要发送给进程B,这可以通过内存映射实现。
主要用到的函数:
1.首先在一个进程里用CreateFileMapping创建一个新的文件映射内核对象。
HANDLE CreateFileMapping(
HANDLE hFile, //物理文件句柄,一般将它设置成为 0xFFFFFFFF(INVALID_HANDLE_VALUE)创建一个物理文件无关的内存映射就可以了
LPSECURITY_ATTRIBUTES lpAttributes, //安全设置,一般设置NULL使用默认的安全配置
DWORD flProtect, //保护设置,下述常数之一:PAGE_READONLY 以只读方式打开映射,PAGE_READWRITE 以可读、可
//写方式打开映射,PAGE_WRITECOPY 为写操作留下备份
DWORD dwMaximumSizeHigh, //文件映射的最大长度的高32位,一般设为0,用低32位一般就够用了
DWORD dwMaximumSizeLow, //文件映射的最大长度的低32位
LPCTSTR lpName //共享内存名称,其他进程可用这个名字来访问这个文件映像
);
函数调用成功就返回一个句柄,后面会继续用到。
2.在该进程将文件映射到一个进程的地址空间上
LPVOID WINAPI MapViewOfFile(
__in HANDLE hFileMappingObject, //CreateFileMapping()返回的文件映像对象句柄
__in DWORD dwDesiredAccess, //与CreateFileMapping()函数所设置的保护属性相匹配
__in DWORD dwFileOffsetHigh, //文件映射起始偏移的高32位
__in DWORD dwFileOffsetLow, //文件映射起始偏移的低32位
__in SIZE_T dwNumberOfBytesToMap //指定映射文件的字节数
);
3.在另一个进程里用OpenFileMapping打开已经创建的文件映像
例子:
进程1中创建映像,并发送数据
<span style="font-size:18px;">//创建文件映像对象 HANDLE hMapping; LPSTR StrData; hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x100,"COMMUNICATION"); if(hMapping==NULL) { MessageBox("创建文件映像对象失败","信息提示",MB_OK); return; } //将文件映射到一个进程的地址空间上 StrData=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0); if(StrData==NULL) { AfxMessageBox("MapViewOfFile() failed."); MessageBox("文件映射失败","信息提示",MB_OK); return; } //向映射内存写数据 sprintf(StrData,m_StrSendData); //释放映像内存 UnmapViewOfFile(StrData);</span>
进程2里接收数据
<span style="font-size:18px;">//创建文件映像对象 HANDLE hMapping; LPSTR StrData; /*hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x100,"COMMUNICATION"); if(hMapping==NULL) { MessageBox("创建文件映像对象","信息提示",MB_OK); return; } //将文件映射到一个进程的地址空间上 StrData=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0); */ hMapping=OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, _T("COMMUNICATION")); if (hMapping == NULL) { MessageBox("打开文件映像对象失败", "信息提示", MB_OK); return; } StrData = (LPSTR)MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); if(StrData==NULL) { AfxMessageBox("MapViewOfFile() failed."); MessageBox("文件映射失败","信息提示",MB_OK); return; } //获取映像内存的数据量 m_StrReceiveData.Format("%s", StrData); //释放映像内存 UnmapViewOfFile(StrData);</span>
使用完记得释放映像内存。
版权声明: