在两个进程间通信

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

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。