Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2279861
  • 博文数量: 668
  • 博客积分: 10016
  • 博客等级: 上将
  • 技术积分: 8588
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-29 19:22
文章分类

全部博文(668)

文章存档

2011年(1)

2010年(2)

2009年(273)

2008年(392)

分类:

2009-05-06 11:16:09

内存映射API函数CreateFileMapping创建一个有名的共享内存:
HANDLE CreateFileMapping(
HANDLE hFile,                                                                        // 映射文件的句柄,
                                                                                                   //设为0xFFFFFFFF以创建一个进程间共享的对象
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,   // 安全属性
DWORD flProtect,                                                                   // 保护方式
DWORD dwMaximumSizeHigh,                                           //对象的大小 
DWORD dwMaximumSizeLow, 
LPCTSTR lpName                                                                 // 必须为映射文件命名
);

与虚拟内存类似,保护方式可以是PAGE_READONLY或是PAGE_READWRITE。如果多进程都对同一共享内存进行写访问,则必须保持相互间同步。映射文件还可以指定PAGE_WRITECOPY标志,可以保证其原始数据不会遭到破坏,同时允许其他进程在必要时自由的操作数据的拷贝。

在创建文件映射对象后使用可以调用MapViewOfFile函数映射到本进程的地址空间内。

下面说明创建一个名为MySharedMem的长度为4096字节的有名映射文件:
HANDLE hMySharedMapFile=CreateFileMapping((HANDLE)0xFFFFFFFF),
NULL,PAGE_READWRITE,0,0x1000,"MySharedMem");
并映射缓存区视图:
LPSTR pszMySharedMapView=(LPSTR)MapViewOfFile(hMySharedMapFile,
FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);

其他进程访问共享对象,需要获得对象名并调用OpenFileMapping函数。
HANDLE hMySharedMapFile=OpenFileMapping(FILE_MAP_WRITE,
FALSE,"MySharedMem");

一旦其他进程获得映射对象的句柄,可以象创建进程那样调用MapViewOfFile函数来映射对象视图。用户可以使用该对象视图来进行数据读写操作,以达到数据通讯的目的。

当用户进程结束使用共享内存后,调用UnmapViewOfFile函数以取消其地址空间内的视图:
if (!UnmapViewOfFile(pszMySharedMapView))
{

         AfxMessageBox("could not unmap view of file");

 }

void CreateFileMappingEx() 

DWORD timebegin = ::timeGetTime(); 
HANDLE fp = CreateFile(TEXT("E:\\jyzhj2.rar"),//这里输入需要复制的文件 src 
GENERIC_READ | GENERIC_WRITE, 
FILE_SHARE_READ, 
NULL, 
OPEN_EXISTING, 
FILE_FLAG_SEQUENTIAL_SCAN, 
NULL); 

if(fp == NULL) 

cout<<"错误"<return; 


DWORD dwBytesInBlock = GetFileSize(fp,NULL); //文件长度 

// 创建文件映射内核对象,句柄保存于hFileMapping 
HANDLE hFileMapping = CreateFileMapping(fp, 
NULL, 
PAGE_READWRITE, 
0,//(DWORD)(dwBytesInBlock >> 16), 
dwBytesInBlock,//(DWORD)(dwBytesInBlock & 0x0000FFFF), 
NULL); 

int dwError = GetLastError(); 

// 释放文件内核对象 
CloseHandle(fp); 

// 偏移地址 
__int64 qwFileOffset = 0; 

// 将文件数据映射到进程的地址空间 
LPVOID pbFile = (LPVOID)MapViewOfFile( hFileMapping, 
FILE_MAP_ALL_ACCESS, 
(DWORD)(qwFileOffset >> 32), 
(DWORD)(qwFileOffset & 0xFFFFFFFF), 
dwBytesInBlock); 

HANDLE wp = CreateFile( TEXT("E://仙剑5.rar"),//这里输入 需要粘贴的文件 dst 
GENERIC_READ | GENERIC_WRITE, 
FILE_SHARE_WRITE, 
NULL, 
CREATE_ALWAYS, 
FILE_FLAG_SEQUENTIAL_SCAN | FILE_FLAG_WRITE_THROUGH, 
NULL); 

HANDLE hFileMapping2 = CreateFileMapping( wp, 
NULL, 
PAGE_READWRITE, 
0,//(DWORD)(dwBytesInBlock >> 16), 
dwBytesInBlock,//(DWORD)(dwBytesInBlock & 0x0000FFFF), 
NULL); 


CloseHandle(wp); 

LPVOID pbFile2 = (LPVOID)MapViewOfFile( hFileMapping2, 
FILE_MAP_ALL_ACCESS, 
(DWORD)(qwFileOffset >> 32), 
(DWORD)(qwFileOffset & 0xFFFFFFFF), 
dwBytesInBlock); 

memcpy(pbFile2,pbFile,dwBytesInBlock); 

UnmapViewOfFile(pbFile2); 
UnmapViewOfFile(pbFile); 

CloseHandle(hFileMapping2); 
CloseHandle(hFileMapping); 
DWORD timeend = ::timeGetTime(); 
cout<<"CreateFileMapping和MapViewOfFile程序运行时间为"<
阅读(2800) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~