数学建模社区-数学中国

标题: 《windows核心编程》中的一个问题 [打印本页]

作者: 噶及    时间: 2012-10-7 22:52
标题: 《windows核心编程》中的一个问题
   有个问题,《windows核心编程》第5版中第47页中说所有可以创建命名的内核对象都共享同一个命名空间,怎么到了第51页又说,默认情况下,在终端服务中,应用程序自己的命名内核对象在会话的命名空间内(按上面的说法不应该是在全局命名空间内吗?)小弟实为不解,望大神指点啊~~
作者: madio    时间: 2012-10-11 18:43
在正在终端服务的计算机上,有很多个用于内核对象的命名空间。其中一个是全局命名空间,所有客户都能访问的内核对象要放在这个命名空间,这个命名空间主要由服务器使用。* A3 x! J* {4 \
2 i8 }4 ^/ m+ |9 H- J
       每个客户端会话(client session)都有一个自己的命名空间,这样多个会话正在运行同一个应用程序才不会彼此干扰,一个会话不会访问另一个会话的对象,即使对象的名称相同。, ?( m" [; A6 j0 h
9 ?8 e2 J( y6 Z) j& }; D* D, ^" w
注意:1 Z: O/ j1 J* b3 z
& R$ C  B( l  [: T7 }1 L4 x
       在没有任何用户登录时,服务回在第一个会话(session 0)中启动,对于服务开发人员,由于必须在与客户端应用程序不同的一个会话中运行,所以会影响到共享内核对象的命名约定。任何对象想要和用户应用程序共享,必须在全局空间中创建它。' i. j$ c2 o- U5 p# g! i

$ f1 |% p6 `3 u       一个服务的命名内核对象始终位于全局命名空间内。默认情况下,在终端服务中,应用程序自己命名的内核对象在会话命名空间内。我们也可以强制把一个命名对象放入全局命名空间中
; D0 j5 o- n7 y2 f/ R! }8 p% E6 P+ a2 w& Q
具体做法在其名称前加上“Global\”  {# a+ a. ?- B6 ]! p

( e( F% x* c6 i# J4 D/ D. R+ m; lHANDLE h = CreateMutex(NULL , false ,"Global\\myMutex");
, Z. g$ V" h# {" N+ u" p$ o- T6 N5 Z8 i- m, k$ {2 L; U6 @
也可以把内核对象放入当前的命名空间中
# m, n( f6 j2 C! V7 O' ?( o; \' Z' r6 r
HANDLE h = CreateMutex(NULL, false ,"Local\\MyMutex");
/ I; I; e5 G2 X: y, r8 c  X1 A+ m0 s1 h, O+ v7 [
还有一些函数可以知道我们的进程在哪个Terminal Services 会话中。2 I4 N6 Z0 T, V3 |- m% r5 ~; U

9 s! a0 {2 q  e8 N% j. UDWORD processID = GetCurrentProcessId();//获取进程ID
4 B0 t) `$ h# b/ H2 q( i6 b6 l; z6 k- e5 r
DWORD sessionID;/ T$ w$ ]/ J% a( a
- T5 Z/ H+ ^3 E! i7 i4 D6 K6 Q0 r& X
ProcessIdToSessionId(processID,&sessionID);//获取进程所在的终端会话ID. c: X8 ]  n5 \" z0 m

) o1 j1 M/ w( Q上面这段注解写的很清楚,在终端服务中,会有很多的客户,他们之间要互不干扰,只有公用的才放到全局的命名空间中,一般的应用程序都是客户使用的,不是公用的。
作者: 噶及    时间: 2012-10-11 23:00
是不是说用对象命名共享内核对象时,这些对象共享一个命名空间是相对于单用户来说的。
( `+ e- L+ M' G9 C0 y5 p7 o而服务的内核对象的全局命名空间是相对全部用户来说的。




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5