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中已调试通过。

时间: 2024-10-26 16:51:36

VC++中实现程序互斥运行的相关文章

实现程序互斥运行的几种方法

在WIN32下,实现程序互斥运行的方法有很多种,我简单分析以下几种不同的实现: 一.在VC下的实现 Visual C++ 是WIN32编程最主要也是最强大的编程工具这一,引用一名话来说VC就是"只有你想不到的,没有VC做不到的".废话少说,下面看看用VC是如何这个功能. A.使用编译器来实现(使用MFC框架): 在.cpp文件开头加上以下几行: #pragma data_seg("Shared") int volatile g_lAppInstance =0; #p

如何让VC和Delphi程序只运行一个实例

有些时候,我们需要我们的程序只运行一个实例,笔者自己作程序也有这样的情况,于是自已探究一番.忙活一阵后,总算小有收获,不敢独享,在天极发表出来,供大家参考. 既然是从根本上解决问题,对于Windows程序而言,就从WinMain函数入口,这是因为在VC中使用SDK的方式编写程序最透明,并且WinMain是作为VC编译器生成EXE文件的默认入口函数. WinMain的函数原型: int WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, L

QT中实现程序只运行一个实例--应用程序的单例化

起因 最近想实现一个应用程序单例化的程序, 目前使QT运行一个实例有如下几种方式 1.QSharedMemory 使用共享内存,当第二个进程启动时,判断内存区数据是否建立,如有,则退出; 这种方式有弊端,在程序发生崩溃时,未及时清除共享区数据,导致程序不能正常启动. 2.文件锁 在程序运行的时候就在目录下创建一个文件,当程序运行时就判断这个文件是否存在,如果存在说明程序已经在运行.其本质与QSharedMemory相同 3.利用QLocalServer 参照 Qt实现应用程序单实例运行–Loca

VC中通过程序向RichEditView写文本

在建立SDI或MDI程序时,如果选择了RichEditView,就可以利用RichEdit提供的丰富的格式,但是如何通过程序在RichEditView中写入文本却是一个问题,下文就介绍了如何实现用程序在RichEditView中写文本. 一.在文本末尾写文字 void CRichEditUseDoc::OnTextWriteafter() { CString str; int nTextLength; CRichEditView *pView = GetView(); CRichEditCtrl

VC中使程序最小化到系统托盘区

//定义托盘图标结构体 NOTIFYICONDATA nid; #define WM_ICONNOTIFY WM_USER + 909 //图标响应消息(lParam) #define ID_TASKBARICON 100 //参数(wParam) //初始化系统托盘图标 void OnBtnMinimize() { //初始化系统托盘图标 nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = m_hWnd;; nid.uID = ID_TASKBARI

在VC中使用Flash美化你的程序

代码运行效果图 利用flash可以作出很漂亮的动画,想不想让自己的程序也有这样漂亮的界面呢? ^_^,其实,要做到这点也不难.在这里将介绍怎样把falsh制作的界面嵌入到自己的程序中,并让flash动画和自己的程序进行交互. 我们分为两步来走: 一.将flash动画嵌入自己的程序中,这一点比较简单,使用shockwave flash object控件就可以实现.这个控件在安装flash的时候就装到你的系统上了,flash5.0以下的文件名是swflash.ocx,5.0以上版本的名字是flash

VC中利用FLASH制作图声并茂的动画程序

前言: FLASH是一种功能强大的矢量动画,可以制作出各种华丽的电影效果,应用非常广泛!这也给予我们一个启迪:如果在VC程序中能够播放FLASH动画,将为程序增色不少,而且许多原本不易实现的功能,现在都可以轻松实现! 像金山词霸的安装程序主控界面就利用了FLASH,效果相当好.本文中笔者将制作一个完整的多媒体软件,将一些关键性技术介绍给大家,并提供全部代码供大家参考. 本文使用到的关键性技术: (1)利用VB制作MS AGENT播放模块. (2)将该播放模块.FLASH动画文件SWF与其它必要资

c++-vc中写好的程序怎么利用控件

问题描述 vc中写好的程序怎么利用控件 我用vc建了个普通的Win32 Console Application工程,代码已写好.但我想用写好的代码利用控件画曲线图,所以我建了个MFC AppWizards[exe]工程,并在里面插入了控件ntgraph,按照网上教程,我在OnInitDialog函数里面写了个简单的显示三角波的程序,并运行成功.但现在我要把我工程里面的代码和控件结合,让曲线显示出来,那该怎么办? 解决方案 for(int xx = 0;xx<1000;xx+=10) //这是我自

c语言-在VC编的程序如何在非VC环境下运行呢?

问题描述 在VC编的程序如何在非VC环境下运行呢? 小白一枚,用C抄了一个猜拳游戏,生成的exe文件貌似不能在别的电脑上运行,有什么方法可以解决呢?静态链接如何实现呢? 解决方案 在VC中,是静态.还是动态,在工程的设置中修改一些设置即可.生成的 EXE 不能在另的电脑上运行,也就是说可以在自己的电脑上运行了.是不是?如果是,先修改为静态链接试试. 解决方案二: 解决方案三: 一个办法是在项目属性里改为MFC静态连接.另一个办法是新电脑运行时缺什么你就拷什么. 解决方案四: 看什么程序,如果是控