防止程序启动两次的方法CreateMutex()

在工程文件中, WinMain函数里加上以下代码(此代码在BCB6.0下运行):

防止程序启动两次的方法CreateMutex() HANDLE hMutex  =  CreateMutex(NULL,  false " Process " );
防止程序启动两次的方法CreateMutex()         
if  (GetLastError()  ==  ERROR_ALREADY_EXISTS)
防止程序启动两次的方法CreateMutex()         
{
防止程序启动两次的方法CreateMutex()            CloseHandle(hMutex);
防止程序启动两次的方法CreateMutex()            MessageBox(Application
->Handle, "程序已经在运行中,不能重复启动!""提示"MB_OK +MB_ICONWARNING);
防止程序启动两次的方法CreateMutex()            Application
->Terminate();
防止程序启动两次的方法CreateMutex()            
return 0;
防止程序启动两次的方法CreateMutex()          }

防止程序启动两次的方法CreateMutex()         Application
-> CreateForm(__classid(TForm1),  & Form1);

主要使用到CreateMutex()函数和GetLastError()以及一个常量ERROR_ALREADY_EXISTS.

当然, 你的程序有窗体的话, 还可以使用FindWindow().

防止程序启动两次的方法CreateMutex() void   * handle  =  FindWindow(NULL, WindowName.c_str()); 
防止程序启动两次的方法CreateMutex()
if  (handle != NULL)
防止程序启动两次的方法CreateMutex()    
return   0
防止程序启动两次的方法CreateMutex()


进程的互斥运行

  正常情况下,一个进程的运行一般是不会影响到其他正在运行的进程的。但是对于某些有特殊要求的如以独占方式使用串行口等硬件设备的程序就要求在其进程运行期间不允许其他试图使用此端口设备的程序运行的,而且此类程序通常也不允许运行同一个程序的多个实例。这就引出了进程互斥的问题。

  实现进程互斥的核心思想比较简单:进程在启动时首先检查当前系统是否已经存在有此进程的实例,如果没有,进程将成功创建并设置标识实例已经存在的标记。此后再创建进程时将会通过该标记而知晓其实例已经存在,从而保证进程在系统中只能存在一个实例。具体可以采取内存映射文件、有名事件量、有名互斥量以及全局共享变量等多种方法来实现。下面就分别对其中具有代表性的有名互斥量和全局共享变量这两种方法进行介绍:

防止程序启动两次的方法CreateMutex() //  创建互斥量
防止程序启动两次的方法CreateMutex()
HANDLE m_hMutex  =  CreateMutex(NULL, FALSE,  " Sample07 " );
防止程序启动两次的方法CreateMutex()
//  检查错误代码
防止程序启动两次的方法CreateMutex()
if  (GetLastError()  ==  ERROR_ALREADY_EXISTS)  {
防止程序启动两次的方法CreateMutex() 
// 如果已有互斥量存在则释放句柄并复位互斥量
防止程序启动两次的方法CreateMutex()
 CloseHandle(m_hMutex);
防止程序启动两次的方法CreateMutex() m_hMutex 
= NULL;
防止程序启动两次的方法CreateMutex() 
// 程序退出
防止程序启动两次的方法CreateMutex()
 return FALSE;
防止程序启动两次的方法CreateMutex() }


上面这段代码演示了有名互斥量在进程互斥中的用法。代码的核心是CreateMutex()对有名互斥量的创建。CreateMutex()函数可用来创建一个有名或无名的互斥量对象,其函数原型为:

防止程序启动两次的方法CreateMutex() HANDLE CreateMutex(
防止程序启动两次的方法CreateMutex() LPSECURITY_ATTRIBUTES lpMutexAttributes, 
//  指向安全属性的指针
防止程序启动两次的方法CreateMutex()
 BOOL bInitialOwner,  //  初始化互斥对象的所有者
防止程序启动两次的方法CreateMutex()
 LPCTSTR lpName  //  指向互斥对象名的指针
防止程序启动两次的方法CreateMutex()
);


如果函数成功执行,将返回一个互斥量对象的句柄。如果在CreateMutex()执行前已经存在有相同名字的互斥量,函数将返回这个已经存在互斥量的句柄,并且可以通过GetLastError()得到错误代码ERROR_ALREADY_EXIST。可见,通过对错误代码ERROR_ALREADY_EXIST的检测可以实现CreateMutex()对进程的互斥。

        建立互斥体,用来同步。如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。

参数
lpMutexAttributes
指向一个SECURITY_ATTRIBUTES结构的指针,这个结构决定互斥体句柄是否被子进程继承。    
bInitialOwner
布尔类型,决定互斥体的创建者是否为拥有者
lpName
指向互斥体名字字符串的指针。互斥体可以有名字。
互斥体的好处是可以在进程间共享

心得体会:
    CreateMutex() 用于有独占要求的程序 (在其进程运行期间不允许其他使用此端口设备的程序运行,或不允许同名程序运行)。如有同名程序运行,则通过 GetLastError()得到错误代码 ERROR_ALREADY_EXIST。

刚才又执

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值