运行单一实例

本文介绍了如何利用Windows API中的CreateMutexA函数来确保程序在同一系统上仅有一个运行实例。通过创建命名互斥对象,并检查其是否存在,可以防止程序重复启动。当互斥对象已经存在(即错误代码ERROR_ALREADY_EXISTS),则表明有另一个相同的程序实例正在运行,否则,程序可以继续启动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         通常情况下,系统的进程是相互独立的,每个进程都拥有自己的独立资源和地址空间,进程间互不影响。故同意经常可以重复运行,且系统上进程互不影响。

        一些特殊情况下,程序在系统上需要只保存一份进程实例,这就引出了进程互斥的问题。
        微软提供了CreateMutex函数来创建或者打开一个已命名或未命名的互斥对象,程序在每次运行的时候,通过判断系统中是否存在相同命名的互斥对象来确定程序是否重复运行。

        CreateMutexA函数一共有3个参数,第一个参数表示互斥对象的安全设置,是一个指向SECURITY_ATTRIBUTES结构的指针,在该程序中直接设置为NULL即可。第二个参数表示线程是否获得互斥锁对象的初始所有权,在该程序中,无论该参数为TRUE还是FALSE,均不影响程序的正常运行。第三个参数表示互斥对象的名称,对于通过互斥对象来判断进程实例是否重复运行的程序来说,该参数一定要设置,而且要保证设置名称的唯一性。

CreateMutexA函数:

HANDLE CreateMutexA(
  [in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes,
  [in]           BOOL                  bInitialOwner,
  [in, optional] LPCSTR                lpName
);

编码实现:

/*
theme:单一运行实例
author:崇山主人
time:2022/10/19
*/
#include<stdio.h>
#include<tchar.h>
#include<windows.h>
#include<SDKDDKVer.h>
BOOL IsAlreadyRun()
{
	HANDLE hMutex = NULL;
	hMutex = ::CreateMutexA(NULL, FALSE, "TEST");
	if (hMutex)
	{
		if (ERROR_ALREADY_EXISTS == ::GetLastError())
		{
			return TRUE;
		}
	}
	return FALSE;
}
int _tmain(int argc, _TCHAR* argv[])
{
	if (IsAlreadyRun())
	{
		printf("----------------------There is already a duplicate program running!!!----------------------\n");
	}
	else
	{
		printf("----------------------The current program runs for the first time!----------------------\n");
	}
	system("pause");
	return 0;
}

测试结果:

        程序首次运行时:

              

         已经有该程序运行时;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值