Windows进程单实例运行
场景
Windows进程单实例运行,如果有进程没有退出,继续等待,直到进程完全退出,才会进入下一个实例
HANDLE pHandle = NULL;
do
{
pHandle = ::CreateMutex(NULL, FALSE, "Global\\fengyuzaitu.blog.51cto.com");
if (ERROR_ALREADY_EXISTS == GetLastError() || ERROR_ACCESS_DENIED == GetLastError())
{
::Sleep(1000);
if (NULL != pHandle) ::CloseHandle(pHandle);
}
else
{
break;
}
} while (1);
//开始进入进程服务代码
//进程结束,关闭句柄
if (NULL != pHandle) ::CloseHandle(pHandle);
分析1)“Global\\”前缀代表全局的内核对象空间,对任何的登陆会话都有效
翻译:https://docs.microsoft.com/zh-cn/windows/desktop/TermServ/kernel-object-namespaces
远程服务器为事件,信号量,互斥量,超时定时器,文件映射对象和作业对象这些命名内核对象,创建不同的命名空间。在客户端/服务器应用程序中存在一个全局的命名空间。此外,在Windows Vista系统中,每一个客户端会话都会有一个隔离的命名空间来存放这些对象。隔离的客户端会话空间允许多个客户运行相同的进程实例而互不干扰。对于在客户端会话启动的进程,系统会在
默认的会话空间中创建进程。但是,所有的进程都共享以"Global\"作为前缀定义的命名空间。例如,下面的代码通过调用CreateEvent,在全局命名空间中创建一个叫CSAPP的的事件对象。
代码
CreateEvent( NULL, FALSE, FALSE, "Global\\CSAPP" );
在远程桌面服务环境中,服务程序默认采用全局命名空间。会话零只应用于宿主服务,没有控制台会话。全局命名空间允许进程同一个服务应用在不同的用户会话进行通信。例如,一个客户端/服务器应用可能会为了同步,使用一个互斥对象。服务断模块创建一个全局命名空间的互斥对象。然后客户端会话可以使用“Global\"前缀打开一个互斥对象。
全局命名空间也可以用在检测一个使用了命名对象的应用是否已经启动,检测的范围包括所有的会话。命名对象必须在全局命名空间中创建或者打开,不能是单个会话空间。The more common case of running the application once per session is supported by default because the named object is created in a per session namespace.除了"Global\"前缀,客户端进程可以用"Local\”前缀在会话空间中几餐对象。关键字大小写敏感。
分析2)
ERROR_ALREADY_EXISTS == GetLastError()
这个错误是在同一个会话中会出现这个错误,同一个会话是指同样的方式启动,在同一个登陆用户以控制台或者服务启动
ERROR_ACCESS_DENIED == GetLastError()
这个错误是在一个进程实例以服务的形式启动,一个进程实例以控制台的形式启动,就会返回这个错误
https://docs.microsoft.com/zh-cn/windows/desktop/api/synchapi/nf-synchapi-createmutexa
CreateMutexA说明
Windows进程单实例运行的更多相关文章
- C++实现程序单实例运行的两种方式
简介 在我们编写程序的时候,经常会注意到的一个问题就是如何能够让程序只运行一个实例,确保不会让同一个程序多次运行,从而产生诸多相同进程,给我们的带来不便呢?那么常用的有以下四种方法,第一种方法是通过扫 ...
- Qt实现应用程序单实例运行--LocalServer方式
使Qt应用程序能够单实例运行的典型实现方法是使用共享内存实现.该方法实现简单,代码简洁. 但有一个致命缺陷:共享内存(QSharedMemory)实现的单程序运行,当运行环境是UNIX时,并且程序不幸 ...
- Winform 单实例运行
Winform 单实例运行 前言 前两天在博客园看到<如何防止程序多次运行>,文章写的很好,最后还留下一个问题给我们思考.关于Winform的防止多次运行,曾经也想研究过,但是后来工作上没 ...
- C#实现单实例运行
C#实现单实例运行的方法,也有多种,比如利用 Process 查找进程的方式,利用 API findwindow 查找窗体的方式,还有就是 利用 Mutex 原子操作,上面几种方法中, 综合考虑利用 ...
- c#设计应用程序单实例运行
利用WindowsFormsApplicationBase的IsSingleInstance来控制应用程序只能单实例运行. [DllImport("user32.dll", Ent ...
- c# 单实例运行
/// <summary> /// 单实例运行程序 /// </summary> static void SingleInstanceRun() { bool isAppRun ...
- WinForm 登录窗体 + 单实例运行
关于怎么在winform里增加登录窗体或者如何让winform程序单实例运行网上都很多例子. 然而两者结合起来呢? //Program.cs static class Program { public ...
- DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法
原文:DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA ...
- 单实例运行tz
(引用了 Microsoft.VisualBasic.ApplicationServices)SingleInstanceApplicationWrapper.cs using System.W ...
随机推荐
- xdoj-1117(记忆化搜索+组合数学)
因为我是从上到下,所以就不叫动态规划而叫记忆化搜索吧 (不过运行时间只有3ms....应该是很不错的吧) 排版怎么那么难看...编辑的时候不是这样子的啊?! 思想 : 大眼一看应该是一道很裸的状压dp ...
- SQL-学习过程-001
1.了解什么是SQL和T-SQL 2.对数据库的对象的学习 数据库>>>数据表>>>字段>>>记录>>>视图>>&g ...
- python基础-函数基本特性和用法
函数: 初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因变量,y是x的函数.自变量x的取值 ...
- 【BZOJ1213】高精度开根
python是坠吼的! 原题: 不贴原题,就是高精度开根,结果向下取整 首先二分答案,高精度嘛……python即可 二分右端点设为n会T掉,需要先倍增一个r,while(r **m <= n) ...
- xenserver使用快照创建虚拟机,提示eth0 has different mac错误
这个报错的意思就是说mac地址错误 我们对比后可以发现,用快照创建的虚拟机和原虚拟机的eth0那个配置文件的 mac地址是一样的,因为mac地址具有唯一性,所以就报这个错,无法配置ip上网 解决方法很 ...
- Dynamic Code Evolution for Java dcevm 原理
在hostswap dcevm中我们对Dynamic Code Evolution VM有了一个简单的了解,这篇文章将介绍Dynamic Code Evolution VM的实现原理. 有两个概念需要 ...
- 06SVM线性不可分时scikit-learn实现
https://blog.csdn.net/weixin_40123108/article/details/84378202 In [5]: from time import time import ...
- Road Crossing Game Template 学习
using UnityEngine; using System; namespace RoadCrossing.Types { /// <summary> /// 小路 /// </ ...
- Python_TCP/IP简介
本篇将开始介绍Python的网络编程,更多内容请参考:Python学习指南 自从互联网诞生以来,现在基本上所有的程序都是网络程序,很少有单机版的程序了. 计算机网络就是把各个计算机连接在一起,让网络中 ...
- OSGI基础知识整理
一. 简介: OSGi(Open Service Gateway Initiative)技术是面向Java的动态模型系统. OSGi的主要职责就是为了让开发者能够创建动态化.模 ...