c++如何让程序只启动一个实例
2009-07-16 09:38
603 查看
1. 用互斥(Mutex),Mutex本来是多线程同步用的,防止多个线程访问同一资源而引发冲突。用CreateMutex可以创建Mutex对象,实质上是一个kernel对象。 在任何Win32程序(包括GDI和Console)的启动部分加上以下代码(Console程序的main函数、MFC程序的CWinApp派生类的InitInstance成员函数、RawSDK程序的WinMain函数): hMutex=CreateMutex( NULL,//nosecurityattributes FALSE,//initiallynotowned "RunOnlyOneInstance"); //命名Mutex是全局对象 //在所有的process都可以访问到 if(hMutex==NULL|| ERROR_ALREADY_EXISTS==::GetLastError()) { //程序第二次或以后运行时,会得到Mutex已经创建的错误 returnFALSE; } 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; } |
相关文章推荐
- c++如何让程序只启动一个实例
- C / C++ 如何让程序只启动一个实例
- c++如何让程序只启动一个实例
- c++ 让程序只启动一个实例
- 当某个程序已经启动,再点击程序快捷方式如何切换到已打开的程序界面(程序只允许启动一个实例)
- 《LInux内核分析》第七周作业:Linux内核如何装载和启动一个可执行程序
- 实验七:Linux内核如何装载和启动一个可执行程序
- 限制启动一个程序实例
- Linux内核如何装载和启动一个可执行程序
- Linux内核如何装载和启动一个可执行程序
- 一个c程序是如何启动和终止的
- UNIX-LINUX编程实践教程->第八章->实例代码注解->写一个简单的shell->在shell中启动另一个程序
- 15.如何在同一个程序中混合使用C++和C
- windows下程序启动检查,只启动一个实例
- 一个正执行的程序如何启动另一新程序并关闭现执行程序
- C#.NET禁止一个程序启动多个实例
- Linux内核如何装载和启动一个可执行程序
- 如何让程序只运行一个实例(转)
- Lunix下如何用shell启动和关闭一个java程序?
- windows下程序启动检查,只启动一个实例