在两个进程间通信
进程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中创建映像,并发送数据
//创建文件映像对象 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);
进程2里接收数据
UpdateData(TRUE); //创建文件映像对象 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);
使用完记得释放映像内存。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。