在软件的开发过程中,有时需要控制一些程序不能同时运行,也就是多个程序间互斥运行(还包括禁止同一程序运行多个实例)。针对这一问题,我们在visual c++ 6.0中利用内存映射文件实现了多个程序间的互斥运行。 在讲述具体的编程方法之前,让我们先来看看和内存映射文件操作有关的几个重要的函数: 1)createfilemapping函数为指定的文件创建一个文件映射对象,该函数的原型如下: handle createfilemapping( handle hfile, // 用于映射的文件句柄 lpsecurity_attributes lpfilemappingattributes, // 内存映射文件的安全描述符 dword flprotect, // 文件的保护方式 dword dwmaximumsizehigh, // 文件映射对象的最大长度的高32位 dword dwmaximumsizelow, // 最大长度的低32位 lpctstr lpname // 指定这个内存映射文件的名字 ); 2)mapviewoffile函数将文件的视图映射到一个进程的地址空间上,返回lpvoid类型的内存指针,通过它,就可以直接访问文件视图中的信息: lpvoid mapviewoffile( handle hfilemappingobjct, // 映射文件对象句柄 dword dwdesiredaccess, // 访问模式 dword dwfileoffsethigh, // 文件偏移地址的高32位 dword dwfileoffsetlow, // 文件偏移地址的低32位 dword dwnumberofbytestomap // 映射视图的大小 ); 在visual c++ 6.0中我们用默认方式生成基于对话框的应用程序,在程序的初始化阶段,在cwinapp派生类的initinstance函数的开始处,添加以下代码: { handle hmap=createfilemapping((handle)0xffffffff, null, page—readwrite, 0, 128, ″mutexrunning″); if(hmap==null) // 如果创建失败 { afxmessagebox(″创建用于互斥运行的内存映射文件对象失败!″, mb—ok|mb—iconstop); return false; } else if(getlasterror()==error—already—exists) { lpvoid lpmem=mapviewoffile(hmap, file_map—write, 0,0,0); cstring str=(char)lpmem; unmapviewoffile(lpmem); closehandle(hmap); afxmessagebox(str, mb—ok|mb—iconstop); return false; } else { lpvoid lpmem=mapviewoffile(hmap, file—map—write, 0,0,0); strcpy((char)lpmem, ″xxx程序正在运行!″); unmapviewoffile(lpmem); }
afxenablecontrolcontainer(); ...... //这里可以在initinstance函数最后returnfalse之前调用 closehandle(hmap); //关闭内存映射文件对象句柄 return false; } 以上的程序在visual c++ 6.0中已调试通过。
|