在讲述具体的编程方法之前,让我们先介绍和内存映射文件操作有关的几个重要的函
CreateFileMapping的函数为指定的文件创建一个文件映射对象,该函数的原形如下:HANDLE CreateFileMapping(HANDLE hFile,//用于映射的文件句柄 LPSECURITY?ATTRIBUTES FileMappingAttributes,//内存映射文件的安全描述符 DWORD Flprotect,//文件映射对象的最大长度的高32位 DWORD dwMaximumSizelow,//最大长度的低32位 LPCTSTR IPNAME//指定这个内存映射文件的名字)
值得注意的是,参数如果是OXFFFFFFFF,将在操作系统虚拟内存页面替换文件中创建文件映射对象,而不是使用磁盘文件,同时必须给出这个映射对象的大小。
NAO VUEWIFFILE函数将文件的视图映射到一个进程地址空间上,返回LPVOID类型的内存指针。通过它,就可以直接访问文件视图中的信息。LPVOID MAP VIEWLFFILE(HANDLE HFILEMAPPINGOBUCT,//映射文件对象句柄 DWORD DWDESIREDACCESS,//访问模式 DWORD DWFILEOFFSETHIGH,//文件偏移地址的高32位 DWORD DWFILEOFFSETHIGH,//文件偏移地址的低32位 DWORD DWNUMBEROFBYTESTOMAP//映射视图的大小)
在Visual c++6.0中我们用默认方式生成基于对话框的应用程序,在程序的初始化阶段,在CwinApp生类的Initln_stance函数的开始处,添加以下代码:
(//创建内存映射文件对象,mu_texRunning是其名字,所有需要互斥运行 //的程序都使用这个名字(这些代码对于需要互斥运行的程序是通用的)HANDLE hMap=CreateFileMapping((HANDLE)0Xffffffffnull,PAGE_READWRLTE,0,128,"Mu_texRunning") if(hMap==NULL)//如果创建失败 (AfxMessageBox("创建用于互斥运行的内存映文件对象失败!”,MB?OK MB??ICLNSTOP);
return FALSE;//退出此程序)
//如果已经存在这个同名对象,说明已有需要互斥的其他程序运行了
else if(GetLastError( )==ER_ROR_ALREADY_EXISTS)
(LPVOID ipMen=MapViewOFFile(hMap,FILE_MAP_WRITE,0,0,0);
Cstring str=(char*)ipMem;//获得已在运行的程序的描述信息
UnmapViewofFile(lpMem);//解除映射图
CloseHandle(hMap);//关闭此对象
AfxMessageBox(str,MB_ok MB_ICONSTOP);显示有关的描述信息
Return FALSE;//退出此程序)
Else//经过上面的检查,说明这是第一个运行的互斥程序
(LPVOID ip_mem=MapViewofFile(hMap,FILE_MAP_WRITE,0,0,0);
//这里可写入该程序运行的描述信息,上面的错误提示就是这信信息
strcpy((char*)lpMem,"xxx程序正在运行!”);
UnmapViewofFile(lpMem);//解除映射图)
//下面可以继续执行函数INITIN?STANCE原有的代码了
AfxEnableControl_comtainer();
//当程序运行结束了,要记住调用CHANDIE(HMAP)关闭这个对象句柄,//这里可以在Initinstance函数最后returnFALSE之前调用
CloseHandle(hMap);//关闭内存映文件对象句柄 RETURN false;)以上的程序在Visual C++6.中已调试通过。其他非对话框类型的程序可以在各自的初始化和终止阶段添加类似的代码,只是如果内存映射文件对象的句柄hMap可能在不同函数中使用,那就要将其定义成CwinApp生类的成员变量或是全局变量了。
本文地址:http://com.8s8s.com/it/it3531.htm