进程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>
使用完记得释放映像内存。