创建专有命名空间单实例程序

C# 命名空间与程序结构 现实世界中不同对象间的相互联系和相互作用构成了各种不同的系统,不同系统间的相互联系和相互作用构成了更庞大的系统,进而构成了整个世界。在面向对象概念中把这些系统称为命名空间。命名空间提供了一种组织相关类和其它类型的方式。与文件或组件不同,命名空间是一种逻辑组合,而不是物理组合,应用命名空间可以防止命名冲突。1. C#命名空间的声明和使用方法2. C的程序结构。 阅读详情
// Singleton.h
#pragma once

class CSingleton
{
public:
	CSingleton(LPCTSTR lpszBoundary = _T("MyAppBoundary"), LPCTSTR lpszNamespace = _T("MyAppNamespace"));
	virtual ~CSingleton(void);

public:
	BOOL IsInstanceExist(LPCTSTR lpszMutex);

private:
	void DUMPINFO(LPCTSTR lpszFormat, ...);

private:
	HANDLE m_hSingleton;
	HANDLE m_hBoundary;
	HANDLE m_hNamespace;
	BOOL m_bNamespaceOpen;
};

// Singleton.cpp
#include "stdafx.h"
#include "Singleton.h"
#include <sddl.h>
#pragma comment(lib, "Advapi32.lib")

#define MAX_BUFFER_LENGTH		(1024)

CSingleton::CSingleton(LPCTSTR lpszBoundary, LPCTSTR lpszNamespace) : m_hSingleton(NULL), m_hBoundary(NULL), m_hNamespace(NULL), m_bNamespaceOpen(FALSE)
{
	// Create the boundary descriptor
	if(lpszBoundary && _tcslen(lpszBoundary))
	{
		m_hBoundary = CreateBoundaryDescriptor(lpszBoundary, 0);
		if(NULL == m_hBoundary)
		{
			DUMPINFO(_T("CreateBoundaryDescriptor failed, error code : %d\r\n"), GetLastError());
			return ;
		}
	}
	if(NULL == m_hBoundary)
	{
		DUMPINFO(_T("m_hBoundarg is NULL\r\n"));
		return ;
	}
	// Create SID corresponding to the local Adminstrator group
	BYTE bySID[SECURITY_MAX_SID_SIZE] = {0};
	PSID pSID = bySID;
	DWORD dwSize = sizeof(bySID);
	if(!CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, pSID, &dwSize))
	{
		DUMPINFO(_T("CreateWellKnownSid failed, error code : %d\r\n"), GetLastError());
		return ;
	}
	// Associate the local admin SID to the boundary descriptor
	if(!AddSIDToBoundaryDescriptor(&m_hBoundary, pSID))
	{
		DUMPINFO(_T("AddSIDToBoundaryDescriptor failed, error code : %d\r\n"), GetLastError());
		return ;
	}
	// Create the namespace for local administrator only
	SECURITY_ATTRIBUTES sa = {0};
	sa.nLength = sizeof(sa);
	sa.bInheritHandle = FALSE;
	if(!ConvertStringSecurityDescriptorToSecurityDescriptor(_T("D:(A;;GA;;;BA)"), SDDL_REVISION_1, &sa.lpSecurityDescriptor, NULL))
	{
		DUMPINFO(_T("ConvertStringSecurityDescriptorToSecurityDescriptor failed, error code : %d\r\n"), GetLastError());
		return ;
	}
	if(lpszNamespace && _tcslen(lpszNamespace))
	{
		m_hNamespace = CreatePrivateNamespace(&sa, m_hBoundary, lpszNamespace);
		DWORD dwRet = GetLastError();
		LocalFree(sa.lpSecurityDescriptor);
		if(NULL == m_hNamespace)
		{
			if(ERROR_ALREADY_EXISTS != dwRet)
			{
				DUMPINFO(_T("CreatePrivateNamespace failed, error code : %d\r\n"), dwRet);
				return ;
			}
			else
			{
				m_hNamespace = OpenPrivateNamespace(m_hBoundary, lpszNamespace);
				if(NULL == m_hNamespace)
				{
					DUMPINFO(_T("OpenPrivateNamespace failed, error code : %d\r\n"), dwRet);
					return ;
				}
				m_bNamespaceOpen = TRUE;
			}
		}
	}
	
	if(NULL == lpszNamespace)
	{
		DUMPINFO(_T("lpszNamespace is NULL\r\n"));
		return ;
	}
}


CSingleton::~CSingleton(void)
{
	if(NULL != m_hSingleton)
	{
		CloseHandle(m_hSingleton);
		m_hSingleton = NULL;
	}
	if(NULL != m_hNamespace)
	{
		ClosePrivateNamespace(m_hNamespace, m_bNamespaceOpen ? 0 : PRIVATE_NAMESPACE_FLAG_DESTROY);
		m_hNamespace = NULL;
	}
	if(NULL != m_hBoundary)
	{
		DeleteBoundaryDescriptor(m_hBoundary);
		m_hBoundary = NULL;
	}
}

void CSingleton::DUMPINFO(LPCTSTR lpszFormat, ...)
{
	TCHAR szText[MAX_BUFFER_LENGTH] = {0};
	va_list argList;
	va_start(argList, lpszFormat);
	_vstprintf_s(szText, _countof(szText), lpszFormat, argList);
	va_end(argList);

	OutputDebugString(szText);
}

BOOL CSingleton::IsInstanceExist(LPCTSTR lpszMutex)
{
	if(m_hBoundary && m_hNamespace && lpszMutex && _tcslen(lpszMutex))
	{
		m_hSingleton = CreateMutex(NULL, FALSE, lpszMutex);
		DWORD dwRet = GetLastError();
		if(NULL == m_hSingleton)
		{
			DUMPINFO(_T("CreateMutex failed, error code : %d\r\n"), dwRet);
			return FALSE;
		}
		if(ERROR_ALREADY_EXISTS == dwRet)
		{
			DUMPINFO(_T("The another instance of App is running ...\r\n"));
			return TRUE;
		}
		else
		{
			DUMPINFO(_T("The first instance of App ...\r\n"));
		}
	}
	return FALSE;
}

// 调用方法,主要修改App类的InitInstance函数
CSingleton* m_pSingleton = NULL; // 定义为App类的成员变量,并在App类的构造函数中初始化为NULL

m_pSingleton = new CSingleton(_T("Chapter3Boundary"), _T("Chapter3Namesapce"));

BOOL CXXXXXApp::InitInstance()
{
 // Check Instance of App
 if((NULL != m_pSingleton) && (m_pSingleton->IsInstanceExist(_T("Chapter3Mutex"))))
 {
   return FALSE;
 }
 ...
}
程序集和命名空间的区别 说道程序集和命名空间这两个名词,就觉得特别的晕,真的是傻傻分不清,不知道为什么会有这样的名字,而它们的作用又是什么,真的完全无厘头,只知道这个名称。好了,接下来我要好好研究一篇了,不可以这样稀里糊涂的学习了。 下面是我在百度上查到官方权威的解释 【程序集定义】 1.程序集(assembly)是一个及一个以上托管模块,以及一些资源文件的逻辑组合。 2.程序集是组件复用,以及实施安全策 阅读详情

相关推荐

C++命名空间创建与应用实战教程

命名空间是C++中用于组织代码的一种机制,它能够避免不同开发者定义的标识符(如类、函数和变量)之间的冲突。命名空间的声明可以让我们创建一个新的命名空间范围,声明语法如下:// 命名空间内的代码和定义在这里,是用户定义的命名空间名称,用来区分不同的命名空间。所有在命名空间块中的声明都将属于该命名空间。代码解释:namespace关键字用来引入命名空间的声明。是自定义的命名空间名称,可以是任意合法的标识符。例如:// ...在上面的例子中,我们创建了一个名为。

weixin_42181686的博客 1021

如何判断应用程序是以管理员身份运行,和如何判断应用程序是以提升的权限来启动的,还是正在使用筛选的令牌运行

摘自Windows核心编程(第五版) 本章讲述两个问题: 1、如何判断应用程序是以管理员身份运行; 2、如何判断应用程序是以提升的权限来启动的,还是正在使用筛选的令牌运行。 下面这个名为GetProcessElevation的辅助函数能返回提升类型和一个指出进程是否正在以管理员身份运行的布尔值。 BOOL GetProcessElevation(TOKEN_ELEVATION_TYP

HHHUANG 3585

计算机模拟爆破过程,基于LSDYNA岩石爆破模拟建模分析

原标题:基于LSDYNA岩石爆破模拟建模分析 Ls Dyna岩石爆破模拟仿真作者:dyna_focus擅长领域:dyna/abaqus/hypermesh一、 数值模型的建立1.1 单元及算法的选择岩石,炸药,空气都采用solid164实体单元。岩石采用常应力实体单元,该种单元属于纯粹的lagrange算法,该种算法单元网格附着在材料上,随着材料的流动而产生单元网格的变形,但是在结构变形巨大时,有...

weixin_29494379的博客 7311

创建专有命名空间实现单实例应用程序

前言: 我们经常利用命名对象来防止运行一个应用程序的多个实例。为此,只需调用一个Create*(如CreateMutex)函数来创建一个命名对象。Create*函数返回后,再调用下GetLastError。如果GetLastError返回ERROR_ALREADY_EXISTS,表明应用程序的另一个实例正在运行,新的实例就可以退出了。 但是任何进程——即使是最低权限的进程——都能用任何指定的名...

a785214563的博客 474

Nornir自动化简单介绍-网络设备信息收集

作为网工,学会通过执行脚本,可以自动化的完成日常一些设备相关配置或信息收集等工作,可以说是事半功倍。 Nornir就是这样一个自动化网络运维工具。按照官网上的说明: Nornir是用python编写的自动化框架,可与python一起使用。Nornir旨在通过提供一个纯Python框架来解决这些问题。 详细参考: Github GitHub - nornir-automation/nornir: Pluggable multi-threaded framework with inventory .

Gun&rose 7804

深入解析五大ADC芯片架构及其应用场景

本文深入解析了五大ADC芯片架构及其应用场景,包括逐次逼近型ADC、Σ-Δ型ADC、流水线型ADC、闪存型ADC和积分型ADC。通过详细的架构分析和实际应用案例,帮助工程师理解不同ADC芯片的特点和适用场景,提升电路设计效率。

weixin_28702105的博客 354

创建专有命名空间的内核命名对象

代码来自 Windows 核心编程。简单修改测试通过(win10)。可能需要管理员权限。提权代码这里没写。 本文只是一个简单示例。 do { wchar_t* _namespace = L"TestNamespace"; wchar_t* _mutexName = L"mutexName"; wchar_t* _boundName = L"TestBoundName"; HA...

yu_sn0w的博客 334

论文阅读:ICLR 2026 Breaking and Fixing Defenses Against Control-Flow Hijacking in Multi-Agent Systems

该论文首先系统阐述了控制流劫持攻击的核心机理。此类攻击通过操纵多智能体系统的编排机制,诱导系统执行非安全操作,进而实现敏感信息窃取。攻击者将恶意指令伪装成环境错误信息,借助可信代理传递至系统编排器,利用"困惑副手"漏洞绕过传统安全防线。该论文指出,现有防御方案如LlamaFirewall所依赖的对齐检查机制存在根本性局限——安全目标与功能需求之间存在不可调和的内在冲突。该论文的核心贡献体现在攻防两个维度。

CSPhD-winston的博客 493

Windows核心编程之核心总结(第三章 内核对象)(2018.6.2)

学习目标 第三章内核对象的概念较为抽象,理解起来着实不易,我不断上网找资料和看视频,才基本理解了内核对象的概念和特性,其实整本书给我的感觉就是完整代码太少了,没有多少实践的代码对内容的实现,而且书本给的源码例子,有太多我们不知道的知识,并且这些知识对本章主要内容来说是多余的,所以我们理解起来也非常困难。为了更好的学习这章,我补充了一些辅助性内容。这一章的学习目标:1.Windows会话和安全机制2...

weixin_34138377的博客 472

《UDS协议从入门到精通》系列——图解0x34:请求下载

上传下载类服务之0x34-请求下载,图解请求+响应格式,直观易懂,快速上手!!

车载系统攻城狮 4924

华为OD机试真题 2026-9-2【查找幸运数】

华为OD机试真题 新系统【查找幸运数】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【查找幸运数】多语言题解。

qq_45776114的博客 496

对象命名空间

windows对象命名空间

armor51的专栏 2184

lammps教程:in文件结构详解以及一个比较实用的in文件模板

lammps软件只是一个求解器,没有可视化的前处理和后处理软件,所有的命令只能通过代码的方式输入到求解器进行求解计算。 所有的命令都被写到一个称为“in”的文件里,对于初学者来说,熟悉in文件的编写是一个难点。 in文件其实就是一个文本文档,也没有要求文件名或者后缀名中必须带有“in”字样,用任何文件名均可运行。 in文件里的代码是按照编写的顺序进行解释执行,对于大部分命令行来说,前后顺序影响并不是很大,但是,对于一些命令,在执行过程中需要某个参数,则这个参数的定义和计算必须写在命令执行之前。 例如,对晶体

lammps_jiayou的博客 2万+

Windows核心编程学习三:利用专有命名空间实现单一实例

注:源码为学习《Windows核心编程》的一些尝试,非原创。若能有助于一二访客,幸甚。 1.基本框架   /******************************************************************************* * File: ErrorShow.cpp * Time: 2013-04-16 * 描述: 修改试验原书同名程序...

weixin_34195546的博客 106

AutoSAR从0开始实战 --- 目录

​​​​​​本专栏是全网最真实的AutoSAR实战专栏,博主将从一个0基础小白的身份来讲解AutoSAR工具的配置,以及相应代码的讲解。

wj博客 1728

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

创建内核对象的专有命名空间

一、方法:     1、创建一个边界     2、如何将对应于本地管理员(Local Administrators)的一个安全描述符(security identifier, SID)和它关联起来     3、如何创建或者打开其名称被用途互斥量内核对象前缀的一个专有命名空间。     {边界描述符将获得一个名称,但更重要的是,它会获得与它关联的一个特权用户组的SID,这样一来,Window...

weixin_34150503的博客 349

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

在C# .NET2.0实现单实例应用程序

【网通】点击此处下载源代码                     【电信、网通】点击此处下载源代码 【电信】点击此处下载演示程序                 【电信、网通】点击此处下载演示程序 点击查看原文地址 【下载说明】 1、单击上面这个地址,打开下载页面。 2、点普通下载--等待30秒--点“下载”按钮--保存 介绍 一个单实例应用程序就是仅让用户打开一个

apk508 2538

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

关闭时最小化到系统托盘中的单实例应用程序

<!--google_ad_client = "pub-0410788977836329";google_ad_width = 468;google_ad_height = 60;google_ad_format = "468x60_as";google_ad_type = "text_image";//2007-07-10: youkuaiyun.comgoogle_ad_cha

Anders Liu (lover_P)的.NET天空 1万+

利用专有命名空间实现单一实例源代码注释

要实现单一实例有三种 一种是对象句柄继承 一种是专有命名  另外一种是复制对象句柄今天来看看专有命名空间 void CheckInstances() { // 创建边界描述符 g_hBoundary = CreateBoundaryDescriptor(g_szBoundary, 0); //g_szboundary是一个自定义字符串 // 创

u012786754的专栏 899

程序集、命名空间、Internal

简单说程集就是一个文件,然后里面包括其他的东西。如资源,自己写的代码。一个程序集中可能包含多个名称空间,internal 访问修饰符就是限定在同一程序集中①什么是程序集?可以把程序集简单理解为你的.NET项目在编译后生成的*.exe或*.dll文件.嗯,这个确实简单了些,但我是这么理解的.详细:http://blog.youkuaiyun.com/sws8327/archive/2006/09/21/12

pierzqy的专栏 2750

命名空间:namespace

本文针对C++的学习过程中的知识进行讲解,在C++的学习中,命名空间是最基础、最简单的知识,是C++程序的关键,希望通过本文,能让学习C++的同学们有所收获,同时,本人水平有限,若本文有不足或错误的地方,还请谅解,欢迎在评论区批评指正,感谢您的阅读。

2301_77387184的博客 1693

c#创建命名空间_在C ++中创建和使用命名空间

c#创建命名空间 在C ++中创建和使用命名空间 (Creating and Using Namespace in C++) Namespace is a container for identifiers. It puts the names of its members in a distinct space so that they don't conflict with the name...

cunfen6312的博客 1610

创建单实例应用程序的三种方法

背景 在编写windows桌面应用程序时,如果我们没有特别处理,我们是可以打开多个应用程序实例的。例如,我们在同一台机器上挂打开多个QQ程序,也可以打开多个浏览器窗口。但有些应用程序,却只运行单个实例运行,如Outlook,MSN等。那么如何实现单实例应用程序呢?下面介绍三种方法。 方法一,扫描进程 这是最容易想到的方法,实现起来也比较简单。扫描进程的代码如下,假设应用程序名称为MySing

Klipdas csdn blog 1889
上一篇: 一个简单的以User权限启动外部应用程序
下一篇: _CrtDumpMemoryLeaks报告程序中的内存泄露问题(简单示例代码)
Eleven
博客等级 码龄19年 4918粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值