有几种方法:
1,用FindWindow()方法,此方法最简单,但缺点是如果没有窗口或标题,就很难实现:
if(FindWindow(NULL,窗口标题)!=NULL)
{
//有实例在运行。
}
2,用Mutex互斥量:
m_hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, strClassName);
if(m_hMutex == NULL)
{
m_hMutex = CreateMutex(NULL, TRUE, strClassName);
}
else
{
::AfxMessageBox("已经有一个实例在运行了!", MB_ICONEXCLAMATION);
return ;
}
最后要用realseMutex()释放该互斥量。
3,用 CreateSemaphore()创建信号量的方法,此方法看上去很烦琐,所以不提供参考程序。
// 信号量已存在?
// 信号量存在,则程序已有一个实例运行
4,通过查找指定进程名方法:
int nFindCount=0;
HANDLE snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(snapshot==NULL)
return 0;
PROCESSENTRY32 processinfo;
processinfo.dwSize=sizeof(processinfo);
BOOL status=Process32First(snapshot,&processinfo);
if(!status)
return 0;
while(status)
{
if(指定进程名==processinfo.szExeFile)
nFindCount++;
status=Process32Next(snapshot,&processinfo);
}
return nFindCount;
该方法可以控制运行的实例数
| 还有一个更简单的方法,我通常就用这个方法,但和编译器相关,仅用于VC++, #pragma data_seg("Shared") unsigned int bmutex = 0; #pragma data_seg() #pragma comment(linker, "/section:Shared,RWS") ... ... InterlockedExchangeAdd(&bmutex, 1); if (bmutex>0) { MessageBox(NULL,TEXT("已经有一个实例在运行!"), TEXT("Error"), MB_OK); ExitProcess(0); return; } 通过在if处设置不同的置,也可以控制实例数! |
本文介绍了五种防止程序多实例运行的方法,包括使用FindWindow()、Mutex互斥量、CreateSemaphore()信号量、查找指定进程名及使用编译器特定功能。每种方法均有其适用场景和优缺点。
502

被折叠的 条评论
为什么被折叠?



