关于《Windows核心编程 5th》“3.3.4终端服务命名空间”章节的理解
2013-05-10 00:34
344 查看
很久之前看到这一小节的时候,基本是一头雾水、半知半解的感觉,因为有太多不熟悉的概念。当时也在网上找了一些资料和博客来看,感觉帮助也不大,于是就跳过了。今天论坛的左懒童鞋突然问了我这个地方应该如何理解,于是决定再好好去看看书,验证自己的想法。
书上主要原话:
在正在运行终端服务的计算机中,有多个用于内核对象的命名空间。其中一个是全局命名空间,所有客户端都能访问的内核对象要放在这个命名空间。对于两个或多个会话正在运行同一个应用程序的情况,这样的安排可以避免会话之间彼此干扰---一个会话不会访问另一个会话的对象,即使对象的名称相同(关键点)。(会话这个概念比较抽象,还没有找到一个适合的描述,我个人的感觉会话就是类似于一个域,然后里面有一堆进程。)
对于服务开发人员,由于必须在与客户端应用程序不同的一个会话中运行,所以会影响到共享内核对象的命名约定。任何对象想要和用户应用程序共享,都必须在全局命名空间中创建它。快速用户切换也会带来类似的问题。我们知道,利用快速用户切换功能,不同的用户可以登录不同的会话,并分别启动自己的用户应用程序。如果我们写的一个服务要与这些应用程序通信,就不能假定它和用户应用程序在同一个会话中运行。
针对上面那两段话,我在Win7环境写了几行代码,做了个简单的测试。
首先在admin帐户(一个会话)中,我在程序中用:
然后将我的应用程序复制到guest帐户的文件夹中,切换guest帐户(另一个会话)并运行这个程序,发现互斥量创建失败,CreateMutex返回NULL,ErrorCode为ERROR_ALREADY_EXISTS。
然后,我将上述代码改为:
于是,也就是验证了我的想法,其实就是一个命名空间的问题,好吧,我也不知道自己想表达些什么,感觉在说废话.......
测试代码:
书上主要原话:
在正在运行终端服务的计算机中,有多个用于内核对象的命名空间。其中一个是全局命名空间,所有客户端都能访问的内核对象要放在这个命名空间。对于两个或多个会话正在运行同一个应用程序的情况,这样的安排可以避免会话之间彼此干扰---一个会话不会访问另一个会话的对象,即使对象的名称相同(关键点)。(会话这个概念比较抽象,还没有找到一个适合的描述,我个人的感觉会话就是类似于一个域,然后里面有一堆进程。)
对于服务开发人员,由于必须在与客户端应用程序不同的一个会话中运行,所以会影响到共享内核对象的命名约定。任何对象想要和用户应用程序共享,都必须在全局命名空间中创建它。快速用户切换也会带来类似的问题。我们知道,利用快速用户切换功能,不同的用户可以登录不同的会话,并分别启动自己的用户应用程序。如果我们写的一个服务要与这些应用程序通信,就不能假定它和用户应用程序在同一个会话中运行。
针对上面那两段话,我在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 ;
}
相关文章推荐
- 什么是终端服务命名空间
- 关于命名空间的理解---iostream与iostream.h的区别
- 关于php规范psr4与psr0命名空间的理解
- 关于XML Schema命名空间中已经有xmlns却还要targetnamespace的理解
- C++(二)关于命名空间(转)
- 关于头文件和命名空间
- 关于带命名空间的gsoap工程编译
- 关于C#引用Dll后,找不到命名空间的问题
- 关于Javascript模块化和命名空间管理
- 关于用Xmlbeans生成XML文件时,节点前会默认加上命名空间的问题
- 错误:"无法从命名空间绑定的导入"错误消息出现,当您试图通过使用 Web 服务描述语言工具创建 XML Web 服务代理文件时
- 关于命名空间
- 关于两个栈的共享空间问题理解。
- 关于头文件和命名空间
- 关于命名空间的函数
- 关于命名空间using的 声明
- 关于反射Assembly.Load("程序集").CreateInstance("命名空间.类")
- 关于DSP哈佛结构的数据空间和程序空间及CMD文件的理解
- 关于C#命名空间的说明与用法
- 关于php 命名空间 和 use not found class