栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

windows启动单个进程实例(系统中只有一个运行实例)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

windows启动单个进程实例(系统中只有一个运行实例)

大家好,我是KookNut39,在CSDN写文,分享一些自己认为在学习过程中比较重要的东西,致力于帮助初学者入门,希望可以帮助你进步。感兴趣的欢迎关注博主,可以去专栏查看之前的文章,希望未来能和大家共同探讨技术。

我们写的程序一般都是可以多次运行的,就比如我随便打开的这个程序,我们一直双击,它会一直启动:

但是有时候哦我们只需要一个进程实例,那我们该怎么办呢?一个进程实例具体是什么时候啊?来看一下Windows的任务管理器:

还有我们平时用的PC版那个绿色的社交软件,只要登录一个账号之后,你每次启动进程,你都会发现打开的是已经登录的那个页面,也就是无法同时登录两个账号(ps: 特殊方法除外)。那我们自己写的程序要做到这一点,是否有难度呢?其实是比较简单的,只需要你对windows编程有一些基础的了解即可。接下啦手把手带大家写一个程序,只能启动一个实例,先说一下环境,我是拿vs写的,默认编码是UNICODE字符集,如果照着我的代码写,编译报错,可以看看字符集的问题:
我们拿简单的console程序距离,主要是说一下用法,首先我们来创建一个GUID,GUID的创建可以使用vs自带的工具,也可以自己网上去查找其它的创建方法,GUID是唯一身份标识码,就和我们身份证ID一样,唯一的。

#include
#include


int main(int argc, LPWSTR* argv)
{
//创建一个互斥体,带有GUID的,如果成功,则返回有效句柄值 GUID是我们通过vs刚生成的
	HANDLE mutexHandle = CreateMutexW(NULL, FALSE, L"Global\{66451FDE-56B1-406A-9810-D6B372BAE28E}");
	if (ERROR_ALREADY_EXISTS == GetLastError()) 
	{
		if (mutexHandle) {
			CloseHandle(mutexHandle);
		}
		MessageBox(NULL, "exist", "single", NULL);
		goto exit;
	}
	std::cout << "starting" << std::endl;
exit:
	return 0;
}

最后的运行效果如下图所示:

好久不见,今天来完成下任务,感觉CSDN好久没更新了,今天简单的过来搞得小demo,和大家玩一玩,如果有人以为我要放大招,那可大错特错了奥!!!
大家可以尝试在这个基础之上改一下这个demo,让它变成,如果程序已经运行就把程序重新加载起来(类似刷新的效果),就好像,打开任务管理器一样的效果,祝大家修改顺利!

其中虽然代码少,但是涉及到windows开发的两个重要基础知识,句柄和互斥体对象,如果大家想了解,那我就后期更新一下这两个小知识点。

“你可以憧憬未来,但不要深陷其中,过好眼前的每一天足矣”
晚安,xdm

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/629183.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号