HANDLE obj; obj = CreateMutex(NULL, FALSE, NULL)对应的linux下如何改写,返回值也要是obj类型。,如何防止程序重复运行,在VC中怎么实现一个程序不能被同时打开多次...
HANDLE obj; obj = CreateMutex(NULL, FALSE, NULL)对应的linux下如何改写,返回值也要是obj类型。
你用的MFC还是???
Linux下面当然有mutex,线程中是pthread_muxtex前缀的一系列函数,进程中用的是mutex前缀的一系列函数,你执行man -k mutex查询下就知道了,包括初始化和锁定解锁等操作。
不过返回值肯定不是HANDLE了,HANDLE是WINDOWS里面才有的数据结构吧...
不知道你做的是什么,不过建议你把整个程序都修改了吧,只改这个API恐怕没用。
如何防止程序重复运行
如何防止程序重复运行
一个vc的程序,由于使用了1394相机和串口资源,在多次运行时死机。
在App::InitInstance()中加入
CreateMutex(NULL,true,m_pszAppName);
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
AfxMessageBox(_T("应用程序不可以重复启动"),MB_OK | MB_APPLMODAL | MB_ICONSTOP);
return(false);
}
把m_pszAppName换成程序的GUIDe值即可。一般在stdafx.h有,例如
#if !defined(AFX_STDAFX_H__A5EA48F2_0257_4B04_B771_A2E1635741D8__INCLUDED_)
#define AFX_STDAFX_H__A5EA48F2_0257_4B04_B771_A2E1635741D8__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
则GUID为:A5EA48F2_0257_4B04_B771_A2E1635741D8
这个值就是的程序ID,可定义为:
#define MY_GUID "{A5EA48F2_0257_4B04_B771_A2E1635741D8}"
然后把MY_GUID替换上面的m_pszAppName的即可。
在VC中怎么实现一个程序不能被同时打开多次
::CreateMutex(NULL,TRUE,"MutexName");//字符串里面的内容可以随便改.他只是一个名字
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
AfxMessageBox("你已经打开了该程序");
exit(0);
return;
}
把上面的代码加入到工程里面的构造函数里面。
原理是在windows内核创建一个Mutex(互斥),根据创建的返回值判断是否2重启动。不管ERROR_ALREADY_EXISTS
::CreateMutex(NULL,TRUE,"MutexName");//创建一个互斥,名字为"MutexName"
if(GetLastError()==ERROR_ALREADY_EXISTS)//判断刚才发生了什么错误。
//当第一次启动的时候,GetLastError()获得的错误是ERROR_SUCCESS所以程序继续运行。windows内核已经存在一个名为"MutexName"的互斥.直到你用ReleaseMutex("MutexName")语句释放掉他,或者当前进程结束。
//当第二重启动的时候,内核已经有一个名为"MutexName"的互斥,所以创建会失败,通过GetLastError()判断上次失败的原因是ERROR_ALREADY_EXISTS,证明已经有个进程存在,exit(0)是结束进程。
个人感觉上段代码放在构造函数里面比放在InitInstance函数内要好。
下一篇:没有了