一、引用计数
二、安全性:客户端一般传递NULL,为默认的安全属性。
n 如果在WIN98上开发、运行良好,而在WIN2000出错,可以把安全属性改为:KEY_QUERY_VALUE
n 如何区分内核对象还是GDI或用户对象?区别在于创建函数是否有安全属性。
三、跨进程边界共享内核对象(方法)
a) (对象句柄的)继承性:
n 创建子进程时,bInheritHnadles=1,将继承父进程中可继承的内核对象(创建时使用了可继承标志)。
n 只有在子进程创建之前的可继承对象才能被继承。
n 传递方法:
1.命令行参数,用sscanf分析
2.进程间通信,WaitForInputIdle
3.环境变量,GetEnvironmentVariable
n 改变句柄标志:SetHandleInformation, GetHandleInformation
b) 命名对象(部分),eg:
n CreateMutex, CreateEvent, CreateSemaphore, CreateWaitableTimer, CreateFileMapping, CreateJobObject。所有这些函数有一个共同的最后参数pszName,如果=NULL,则为匿名内核对象(可通过可继承性或DuplicateHandle共享);如果=以0结尾的字符串(长<MAX_PATH)则为命名对象(但是,可以因为名称冲突而创建失败,GetLastError返回ERROR_INVALID_HANDLE)。
n 不必为可继承句柄。
n 第二个进程可以用相同的名称创建对象(实际上是对原对象的引用,可以用GetLastError()== ERROR_ALREADY_EXISTS判别)
n 显式共享的方法(使用Open*函数):OpenMutex,OpenEvent, OpenSemaphore, OpenWaitableTimer, OpenFileMapping, OpenJobObject。其最后的参数pszName必须指明内核对象的名称。如果不存在,GetLastError返回ERROR_FILE_NOT_FOUND。如果有访问权,则句柄表跟新。如果bInheritHandle=TRUE,则可继承。
c) 终端服务器的名字空间
n 显式进入全局名称空间方法,用“Global/”,eg:
HANDLE h = CreateEvent(NULL, FALSE, FALSE, “Global//MyName”);
n 显式进入会话的名字空间方法,用“Local/”,eg:
HANDLE h = CreateEvent(NULL, FALSE, FALSE, “Local//MyName”);
n Global, Local, Session为Windows保留关键字,区分大小写。
d) 复制对象句柄(DuplicateHandle)