码迷,mamicode.com
首页 > 系统相关 > 详细

在两个进程间通信

时间:2015-03-17 21:52:29      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:c++   mfc   进程间通信   

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

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

在两个进程间通信

标签:c++   mfc   进程间通信   

原文地址:http://blog.csdn.net/u014568921/article/details/44349111

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!