文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>c / c++ 如何让程序只启动一个实例...

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

时间:2010-08-09  来源:cgb0210

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;  
  }

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载