⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 15.5 保证应用程序只青一个实例运行.txt

📁 网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节都分了目录,清晰易读
💻 TXT
字号:
15.5 保证应用程序只青一个实例运行

不知道读者是否曾经注意过,在使用金山词霸时,同时只能运行一个金山词霸程序的实例。当多次
打开金山词霸程序时,它实际上是将先前已经运行的金山词霸实例激活,使其处于前台运行的程序。
对这种同时只能有应用程序的一个实例运行的功能,可以通过命名的互斥对象来实现。在调用 
CreateMutex函数创建一个命名的互斥对象后,如果其返回值是一个有效的句柄,那么可以接着调用 
GetLastError函数,如果该函数返回的是 ERROR_ALREADY_ EXISTS,就表明先前己经创建了这个命
名的互斥对象,因此就可以知道先前己经有该应用程序的一个实例在运行了。当然如果 
GetLastError函数返回的不是 ERROR ALREADY_EXISTS,就说明这个互斥对象是新创建的,从而也就
知道当前启动的这个进程是应用程序的第一个实例。
下面,我们就为 MultiThread程序添加代码,以实现同时只能启动该程序的一个实例。修改后的 man
函数如例 15-7所示。 
例 15-7 

void maín () 
HANDLE hThread1; 
HANDLE hThread2; 

//创建线程
hThread1=CreateThread(NULL, 0, Fun1Proc ,NULL , 0,NULL); 
hThread2=CreateThread(NULL, 0,Fun2Proc ,NULL , 0, NULL); 
CloseHandle(hThread1); 
CloseHandle(hThread2) ; 

//创建互斥对象 
hMutex=CreateMutex(NULL , TRUE , "tíckets") ; 
if (hMutex) 
{ 

if(ERROR_ALREADY_EXISTS==GetLastError()) 
{ cout<<"only one ínstance can run! "<<Emdl; 
return; 

WaitForSingleObject(hMutex, INFINITE) ; 
ReleaseMutex(hMutex) ; 
ReleaseMutex(hMutex) ; 
Sleep(4000) ; 

在上述例 15-7所示代码中,首先调用 CreateMutex函数创建一个命名的互斥对象,至于该对象的名
字,读者可以根据需要随意指定。接着,判断返回的互斥对象句柄( hMutex )是否有值,如果有值,
那么就调用 GetLastError函数,并对其返回值进行判断。如果判断出该函数返回的是 
ERROR_ALREADY_EXISTS,那么说明该命名的互斥对象已经被创建了,也就说明已经有一个该程序的
实例在运行了,于是输出一行字符 :"only instance cm run!",提示用户同时只能运行该程序的一
个实例,然后程序立即返回,不再向下继续运行。
读者可以先运行一个 MultiThread程序的实例,然后再次运行该程序,这时程序会打印出: "only one 
instance can run!"这行字符,如图 15.12所示。因为该程序在第二次运行时,它判断出先前已经
有一个该程序的实例在运行了,所以它就打印出那行提示字符并立即退出。这就是利用命名的互斥
对象实现同时只能有应用程序的一个实例在运行这一功能的方法。

图 15.12同时只能运行应用程序的一个实例 


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -