关于内存映射文件的不解

byssx752 2008-04-03 11:29:48

以下是微软提供的两个进程通过映射文件访问的例子,我的不解是第二个进程调用UnmapViewOfFile(pBuf)的话,是不是第一个进程
MapViewOfFile的内存也被释放了。2.如果第一个进程UnmapViewOfFile(pBuf)了,内存映射文件的内容是不是清除了,是不是第二个进程就无法访问内存映射文件了或者访问到,但是获得内存内容为空了。
谢谢。小弟愚昧,请达人指教


第一个
#include <windows.h>
#include <stdio.h>
#include <conio.h>

#define BUF_SIZE 256
TCHAR szName[]=TEXT("MyFileMappingObject");
TCHAR szMsg[]=TEXT("Message from first process");

void main()
{
HANDLE hMapFile;
LPCTSTR pBuf;

hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // max. object size
BUF_SIZE, // buffer size
szName); // name of mapping object

if (hMapFile == NULL || hMapFile == INVALID_HANDLE_VALUE)
{
printf("Could not create file mapping object (%d).\n",
GetLastError());
return;
}
pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);

if (pBuf == NULL)
{
printf("Could not map view of file (%d).\n",
GetLastError());
return;
}


CopyMemory((PVOID)pBuf, szMsg, strlen(szMsg));
getch();

UnmapViewOfFile(pBuf);

CloseHandle(hMapFile);
}
/////////////////////////////////////////////
第二个
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <windows.h>

#define BUF_SIZE 256
TCHAR szName[]=TEXT("MyFileMappingObject");

void main()
{
HANDLE hMapFile;
LPCTSTR pBuf;

hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // read/write access
FALSE, // do not inherit the name
szName); // name of mapping object

if (hMapFile == NULL)
{
printf("Could not open file mapping object (%d).\n",
GetLastError());
return;
}

pBuf = MapViewOfFile(hMapFile, // handle to mapping object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);

if (pBuf == NULL)
{
printf("Could not map view of file (%d).\n",
GetLastError());
return;
}

MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);

UnmapViewOfFile(pBuf);

CloseHandle(hMapFile);
}

...全文
53 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
gomoku 2008-04-03
  • 打赏
  • 举报
回复
MapViewOfFile并不分配内存,它提供了一段窗口以便你透过这个窗口去读取共享内存.
你可以映射共享内存的全部,开头部分,中间,或者尾部. 你甚至多次映射等等.

UnmapViewOfFile只是取消一个映射,它并没有释放内存.

File-Mapping是一个内核对象. 所有句柄关闭了,分配的内存就释放了:
CloseHandle(hMapFile);


15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧