C / C++ 如何让程序只启动一个实例

8 篇文章 0 订阅
2 篇文章 0 订阅

1. 用互斥(Mutex),Mutex本来是多线程同步用的,防止多个线程访问同一资源而引发冲突。用CreateMutex可以创建Mutex对象,实质上是一个kernel对象。    

#include "windows.h"
在任何Win32程序(包括GDI和Console)的启动部分加上以下代码(Console程序的main函数、MFC程序的CWinApp派生类的InitInstance成员函数、RawSDK程序的WinMain函数):
    HANDLE hMutex=CreateMutex(
        NULL,//nosecurityattributes
        FALSE,//initiallynotowned
        (const unsigned short *)("RunOnlyOneInstance"));
    if(hMutex==NULL||
          ERROR_ALREADY_EXISTS==::GetLastError()) {
     QMessageBox::warning(NULL, "error", "sadfasfs");
          //程序第二次或以后运行时,会得到Mutex已经创建的错误
          return -1;
      }

2.查找窗口,激活。  
  HWND   hOldWnd;  
  if((hOldWnd=::FindWindow(NULL,_T("志软个人信息管理")))!=NULL)  
  {   
      ShowWindow(hOldWnd,SW_RESTORE | SW_SHOWNORMAL);  
      SetForegroundWindow(hOldWnd);  
      return   FALSE;
  }

3.内存映射文件MutexRuning为程序名
 
  初始化阶段:  
  InitInstance中:
  HANDLE   hMap=CreateFileMapping((HANDLE)0xffffffff,NULL,PAGE_READWRITE,0,128,  
                                                              "MutexRuning");  
  if(hMap==NULL)  
  {   
      AfxMessageBox("创建内存映射文件失败",MB_OK|MB_ICONSTOP);   
      return   FALSE;  
  }  
  else   if(GetLasError()==ERROR_ALREADY_EXISTS)  
  {   
      LPVOID   lpMem=MapViewOfFile(hMap,FILE_MAP_WRITE,0,0,0);   
      CString   str=(char   *)lpMem;   
      UnmapViewOfile(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, "xxxx正在运行!");   
      UnmapViewOfFile(lpMem);  
  }

4.使用原子    
  BOOL   CMainApp::InitInstance()  
  { 
      .....   
      if(GlobalFindAtom("AdBreaker"))     //找原子   
          return   false;   
      ATOM   GlobalAtom=GlobalAddAtom("AdBreaker");   //添加原子   
      CAdBreakerDlg   dlg;   
      m_pMainWnd   =   &dlg;   
      int   nResponse   =   dlg.DoModal();   
      .....           
      GlobalDeleteAtom(GlobalAtom);   
      return   FALSE;  
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值