现在的位置: 首页 > 综合 > 正文

关于《Windows核心编程 5th》“3.3.4终端服务命名空间”章节的理解

2012年09月27日 ⁄ 综合 ⁄ 共 1486字 ⁄ 字号 评论关闭

很久之前看到这一小节的时候,基本是一头雾水、半知半解的感觉,因为有太多不熟悉的概念。当时也在网上找了一些资料和博客来看,感觉帮助也不大,于是就跳过了。今天论坛的左懒童鞋突然问了我这个地方应该如何理解,于是决定再好好去看看书,验证自己的想法。


书上主要原话:

在正在运行终端服务的计算机中,有多个用于内核对象的命名空间。其中一个是全局命名空间,所有客户端都能访问的内核对象要放在这个命名空间。对于两个或多个会话正在运行同一个应用程序的情况,这样的安排可以避免会话之间彼此干扰---一个会话不会访问另一个会话的对象,即使对象的名称相同(关键点)。(会话这个概念比较抽象,还没有找到一个适合的描述,我个人的感觉会话就是类似于一个域,然后里面有一堆进程。

对于服务开发人员,由于必须在与客户端应用程序不同的一个会话中运行,所以会影响到共享内核对象的命名约定。任何对象想要和用户应用程序共享,都必须在全局命名空间中创建它。快速用户切换也会带来类似的问题。我们知道,利用快速用户切换功能,不同的用户可以登录不同的会话,并分别启动自己的用户应用程序。如果我们写的一个服务要与这些应用程序通信,就不能假定它和用户应用程序在同一个会话中运行。


针对上面那两段话,我在Win7环境写了几行代码,做了个简单的测试。

首先在admin帐户(一个会话)中,我在程序中用:

HANDLE hMutex = CreateMutex(NULL,FALSE,TEXT("Global\\Handle")) ; 

创建一个放在全局命名空间中的互斥量对象,并调用Sleep(INFINITE)挂起程序,让个内核对象一直保持着。

然后将我的应用程序复制到guest帐户的文件夹中,切换guest帐户(另一个会话)并运行这个程序,发现互斥量创建失败,CreateMutex返回NULL,ErrorCode为ERROR_ALREADY_EXISTS。

然后,我将上述代码改为:

HANDLE hMutex = CreateMutex(NULL,FALSE,TEXT("Local\\Handle")) ;

随后执行同上的操作,发现在guest帐户中,这个程序也能够成功创建这个同名的内核对象。


于是,也就是验证了我的想法,其实就是一个命名空间的问题,好吧,我也不知道自己想表达些什么,感觉在说废话.......

测试代码:

#include<windows.h>
#include<cstdio>
#include<iostream>

int main(void)
{
	//在全局命名空间中创建内核对象,用不同帐户运行该程序,不能创建同名的内核对象。
//	HANDLE hMutex = CreateMutex(NULL,FALSE,TEXT("Global\\Handle")) ; 	
	//在局部命名空间中创建内核对象,用不同帐户运行该程序,可以创建同名的内核对象。
//	HANDLE hMutex = CreateMutex(NULL,FALSE,TEXT("Local\\Handle")) ;	
	HANDLE hMutex = CreateMutex(NULL,FALSE,TEXT("Handle")) ;  //同上

	//在局部命名空间测试示例中要用GetLastError检测,在全局命名空间测试示例中要判断hMutex是否为NULL
	if(NULL == hMutex || GetLastError() == ERROR_ALREADY_EXISTS)   
	{
		printf("已经存在互斥量对象\n") ;
		return 0 ;
	}
	printf("成功创建互斥量对象\n") ;

	Sleep(INFINITE) ;

	return 0 ;
}





抱歉!评论已关闭.