进程间通信——内存映射

进程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>

使用完记得释放映像内存。

版权声明:

原文地址:https://www.cnblogs.com/walccott/p/4957107.html