进程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); 原文:http://blog.csdn.net/u014568921/article/details/44349111