c++如何让程序只启动一个实例
2012-10-19 15:17
337 查看
from:/article/2403699.html
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;
}
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++ 让程序只启动一个实例
- C#.NET禁止一个程序启动多个实例
- Lunix下如何用shell启动和关闭一个java程序?
- 一个java调用c++程序的实例(jni)
- [网易云课堂]Linux内核分析(七)—— Linux内核如何装载和启动一个可执行程序
- More Effective C++ 条款34 如何在一个程序中结合C++和C
- 条款三十四:如何在同一个程序中结合C++和C
- Linux内核如何装载和启动一个可执行程序
- 如何使一个程序运行唯一实例
- Linux内核如何装载和启动一个可执行程序
- Linux内核如何装载和启动一个可执行程序
- 如何通过bat文件启动一个带main函数的程序
- Linux内核如何装载和启动一个可执行程序
- 如何让Java程序只运行一个实例
- 如何在同一个程序中混合使用C++和C
- C++程序运行一个实例(互斥量法)