我生如山

[Win32]用Mutex控制程序的运行实例数目

在很多情况下,我们需要控制当前程序只能在本机上存在一个运行实例;如果程序已存在运行实例,则在启动程序的时候,提示用户程序已在运行。这可以通过Windows操作系统提供的Mutex来支持,有关Mutex的详情,可以参考操作系统相关的书籍。
为用Mutex实现这种效果,我们许要了解下Win32里面的CreateMutex这个函数:

CreateMutex

The CreateMutex function creates or opens a named or unnamed mutex object.

HANDLE CreateMutex(
  LPSECURITY_ATTRIBUTES lpMutexAttributes,
  BOOL bInitialOwner,
  LPCTSTR lpName
);

在调用这个函数的时候,程序会以lpMutexAttributes和bInitialiOwner参数在当前的程序上下文中创建一个lpName指示的名字的Mutex,如果创建成功,程序返回新创建的mutex对象的handle,如果创建失败,返回NULL,用户可以调用GetLastError函数获取错误代码。如果lpName指示的这个mutex对象已经存在(程序已经存在运行实例),则函数返回已经存在的该mutex对象的句柄,调用GetLastError会得到ERROR_ALREADY_EXISTS的错误。
 
那么我们程序要做的就是创建这个mutex对象,检测错误代码,若是ERROR_ALREADY_EXISTS,则表明程序已经运行。
 
这是代码:
 
 CreateMutex(NULL,TRUE,"TestMutex");
 DWORD lastError
=GetLastError();
 
if(ERROR_ALREADY_EXISTS==lastError)
 
{
  MessageBox(NULL,
"An instance of thie program already exists!","Information",MB_OK);
  
return 1;
 }

posted on 2009-05-17 16:45 悟山 阅读(627) 评论(2)  编辑 收藏 引用

Feedback

# re: [Win32]用Mutex控制程序的运行实例数目 2009-05-18 16:02 陈梓瀚(vczh)

我怎么记得Mutex是不能跨进程的,Semaphore才可以。  回复  更多评论   

# re: [Win32]用Mutex控制程序的运行实例数目 2009-05-19 12:16 eXile

Windows下可以,只用于线程的叫critical_section  回复  更多评论   



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理