使用文件映射实现进程通信

使用文件映射实现进程通信是通过让两个或更多的进程映射同一文件映射对象的视图来实现的,也就是说它们共享着相同的物理存储页面。结果,当一个进程对在一个共享文件映射对象的视图中的数据进行写操作时,其它进程立刻在它们的视图中看到了改动。注意,对于多个进程共享一个文件映射对象,所有进程必须对该文件映射对象使用完全相同的名字。

使用内存映射文件时,调用CreateFileMapping()创建文件。一旦已创建了一个文件映射对象后,就需要告诉系统你想把文件映射到一个地址空间。这可以通过调用MapViewOfFile来实现。

CreateFileMapping()的函数声明:
HANDLE CreateFileMapping(
HANDLE hFile, //文件的句柄
LPSECURITY_ATTRIBUTES lpAttributes, //与安全有关的设置
DWORD flProtect, //用来决定与view有关的属性
DWORD dwMaximumSizeHigh, //设置映射文件的尺寸
DWORD dwMaximumSizeLow,
LPCTSTR lpName //文件映射对象的名称
);
MapViewOfFile()函数的声明:
LPVOID MapViewOfFile(
HANDLE hFileMappingObject, //文件映射的句柄
DWORD dwDesiredAccess, //此view的属性
DWORD dwFileOffsetHigh, //view文件的起点
DWORD dwFileOffsetLow,
SIZE_T dwNumberOfBytesToMap //映射区的大小
);
发送端(写数据):

void CSendDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
HANDLE m_hMap;
WCHAR* m_lpData;

m_hMap=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x200,_T("MYSHARE"));

//将文件的视图映射到一个进程的地址空间上,返回LPVOID类型的内存指针
m_lpData=(WCHAR*)MapViewOfFile(m_hMap,FILE_MAP_ALL_ACCESS,0,0,0);

//给这段映像内存写数据
wsprintf(m_lpData,_T(“Hello."));

}

接收端(读数据):
void CReceiveDlg::OnBnClickedButton1()
{
HANDLE m_hMap=NULL;
WCHAR* m_lpData;

//m_hMap=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x200,"MYSHARE");
m_hMap = OpenFileMapping(FILE_MAP_WRITE,FALSE,"MYSHARE");
if(m_hMap==NULL)
return;


//将文件的视图映射到一个进程的地址空间上,返回LPVOID类型的内存指针
m_lpData=(WCHAR*)MapViewOfFile(m_hMap,FILE_MAP_ALL_ACCESS,0,0,0);
if(m_lpData==NULL)
return;
//。。。

//释放映像内存
UnmapViewOfFile(m_lpData);
CloseHandle(m_hMap);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值