dwProtect页面保护值
参 数 | 说 明 |
PAGE_READONLY | 对页面的提交区域赋予只读权限。参数hFile指定的文件必须由GENERIC_ READ权限创建 |
PAGE_READWRITE | 对页面的提交区域赋予读写权限。参数hFile指定的文件必须由GENERIC_ READ和GENERIC_WRITE权限创建 |
PAGE_WRITECOPY | 对页面的提交区域赋予复制和写入权限。 参数hFile指定的文件必须由GENERIC_READ和GENERIC_WRITE权限创建 |
dwProtect节属性
参 数 | 说 明 |
SEC_COMMIT | 为节中所有页面在内存或磁盘上的映射文件分配物理空间,在此为默认设置 |
SEC_IMAGE | hFile指定的文件为一可执行Image文件,设置此值使其他属性无效 |
SEC_NOCACHE | 所有文件都设置为没有高速缓存 |
SEC_RESERVE | 保留节的所有页面,但不分配物理空间。除非已经释放,否则页面的保留区域不能由其他分配操作所使用。这个属性仅在hFile设置为0xFFFFFFFF时才有效 |
● 返回值
如果函数调用成功则返回文件映射对象的句柄,否则返回NULL。
● 说明
该函数将文件视图映射到调用过程的地址空间。
● 原型
LPVOID MapViewOfFile (HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
SIZE_T dwNumberOfBytesToMap );
● 参数
hFileMappingObject:是文件映射对象的句柄,可以是CreateFileMapping函数和Open FileMapping函数返回的句柄。
dwDesiredAccess:为存取访问方式,可以是表7-5所示的参数之一。
参数dwDesiredAccess的值
参 数 | 说 明 |
FILE_MAP_WRITE | 读写权限。hFileMappingObject参数必须用PAGE_ READ WRITE来创建 |
FILE_MAP_READ | 只读权限。hFileMappingObject参数必须用PAGE_ READ WRITE或PAGE_READONLY来创建 |
FILE_MAP_ALL_ACCESS | 其含义与参数FILE_MAP_WRITE相同 |
FILE_MAP_COPY | 读写权限。Windows 95:调用编程文章/filemap_79wn.htm">CreateFileMapping函数必须使用保护属性为PAGE_WRITECOPY,否则调用失败。Windows NT/2000:没有限制使用保护属性 |
dwFileOffsetHigh:偏移量的高32位。
dwFileOffsetLow:偏移量的低32位。
dwNumberOfBytesToMap:为要映射文件的字节数,如果设置为零,则映射整个文件。
● 返回值
如果函数调用成功则返回映射视图的起始地址,否则返回零。
调用此函数后,过程可以使用函数DulplicateHandle将文件映射对象复制到另一个过程中,或者另一个过程可以通过使用函数OpenFileMapping按名称打开一个文件映射对象。
● 说明
该函数用于打开命名文件映射对象。
● 原型
HANDLE OpenFileMapping (DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName );
● 参数
dwDesiredAccess:对象的存取访问方式,具体见表7-5所示。
bInheritHandle:继承标记,用于确定返回的句柄是否在过程创建期间由其他过程继承。若设置为TRUE,则表明新过程继承句柄。
lpName:包含要打开的文件映射对象的名称。
● 返回值
如果函数调用成功则返回要打开的文件映射对象的句柄,否则返回NULL。
只要映射的是相同的文件映射对象,系统就能保证一个文件的多个视图是一致的。这就表明在任何一个视图下,对文件进行修改都将为其他视图所见。这仅仅是在文件映射对象相同的情况下出现,如果文件映射对象不同,系统就无法保证视图的一致性,这是很显然的。对于同一文件的文件映射对象,如果文件是只读文件,那么视图始终是一致的。但如果为可写文件,那么视图很可能就不会保持一致了。
介绍完了内存映射文件的有关函数之后,下面举例介绍以上函数的具体实现,并分析其中所涉及的其他函数。
DWORD Process1( )
{
HANDLE hFileMap;
LPTSTR lpMapAddress;
// 打开要进行映射的文件
hFileMap = OpenFileMapping( FILE_MAP_ALL_ACCESS, FALSE,
“FileMappingObject” );
// 为要映射的文件建立一个视图
lpMapAddress = MapViewOfFile( hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
// 显示内存块中的内容,也就是视图的内容
MessageBox(NULL,lpMapAddress,”Mapped Memory”,MB_OK
|MB_ICONINFORMATION );
UnmapViewOfFile(lpMapAddress);
return( 0 );
}
case WM_CREATE:
hMap = CreateFileMapping(( HANDLE)0xFFFFFFFF, NULL,
PAGE_READWRITE,
0,1024,“FileMappingObject”);
lpData = MapViewOfFile( hMap,FILE_MAP_ALL_ACCESS, 0, 0, 0);
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)
{
case IDM_VIEWMAP :
strcpy( lpData, “Hi, I am Data passed from main process.”);
FlushViewOfFile( lpData, lstrlen( lpData ));
hThread = CreateThread( NULL, 0,
(LPTHREAD_START_ROUTINE)Process1,
lpData, 0, &dwID);
break;
case IDM_BACKMAINPROCESS:
if(!(hThread = 0))
TerminateThread(hThread,0);
strcpy(lpData,“I am in the main process “ );
FlushViewOfFile(lpData,lstrlen(lpData ));
hMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE,
“FileMappingObject” );
lpData = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
MessageBox( hWnd, lpData, “Main Process”, MB_OK);
UnmapViewOfFile( lpData);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}