VC++中实现程序互斥运行

原创 2001年05月11日 13:17:00

                                             VC++中实现程序互斥运行

在软件的开发过程中,有时需要控制一些程序不能同时运行,也就是多个程序间互斥运行(还包括禁止同一程序运行多个实例)。针对这一问题,我们在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中已调试通过。
 

 

C++多线程实例之互斥量同步

要点:将互斥量 + 条件变量/事件对象封装为了一个类CMutexLock,该类同时支持windows和linux下的互斥量同步。对熟悉windows和linux下面的多线程开发很有帮助。下面的代码可以...
  • Blues1021
  • Blues1021
  • 2015年03月21日 22:39
  • 3198

<MFC笔记> 四种线程同步(或互斥)方式小结

一,什么是线程同步? 同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。这里的同步千万不要理解成那个同时进行,应是指协同、协助、互相配合。 线程同步是指多线程通过特定的设置(如互斥量,...
  • EbowTang
  • EbowTang
  • 2014年06月10日 21:35
  • 1983

shell脚本单实例互斥

##shell执行脚本单实例互斥问题 比如说有一个周期性(cron)备份mysql的脚本,或者rsync脚本,如果出现意外,运行时间过长, 很有可能下一个备份周期已经开始了,当前周期的脚本却还...
  • jsyxcjw
  • jsyxcjw
  • 2015年09月30日 17:19
  • 1495

在VC++中实现让程序只运行一个实例的方法

方法一:   有时候在开发应用程序时,希望控制程序运行唯一的实例。例如,最常用的mp3播放软件Winamp,由于它需要独占计算机中的音频设备,因此该程序只允许自身运行唯一的一个例程。在Visua...
  • zbzoujianfa
  • zbzoujianfa
  • 2011年11月03日 09:34
  • 372

VC++实现程序只运行一个实例

原文地址:http://www.cctry.com/thread-8229-1-1.html                   http://www.vckbase.com/index.php...
  • WUYUAN2011WOAINI
  • WUYUAN2011WOAINI
  • 2012年10月18日 23:09
  • 5631

VC++实现程序只运行一个实例 .

原文地址:http://www.cctry.com/thread-8229-1-1.html                   http://www.vckbase.com/index.php/w...
  • zdhlwt2008
  • zdhlwt2008
  • 2015年08月14日 11:55
  • 1207

基于VC++和OpenGL实现的IGM机器人手臂三维显示,程序可直接运行

  • 2017年12月25日 16:30
  • 11.01MB
  • 下载

VC++中实现让程序只运行一个

  • 2015年11月15日 18:37
  • 6KB
  • 下载

在VC++ 6.0中实现程序单一运行C++源代码程序小实例

  • 2010年03月23日 21:25
  • 830KB
  • 下载

VC++学习(1):Windows程序内部运行原理

Windows应用程序,操作系统,计算机硬件之间的相互关系            关于API:向下的箭头③表示应用程序可以通知操作系统执行某个具体的动作,如操作系统能够控制声卡发出...
  • Ibznphone
  • Ibznphone
  • 2012年10月15日 15:43
  • 634
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC++中实现程序互斥运行
举报原因:
原因补充:

(最多只允许输入30个字)