MFC 内核对象用法简略

1、内核对象
内核分配的内存块,只能由内核访问,该内存块是一种 数据结构,其成员负责维护该对象的各种信息。内核的访问通过 句柄来完成,非特殊情况下句柄限定在 同一线程内才能传递成功。
2、内核对象的创建
HANDLE CreateThread(  )
HANDLE CreateFile(  )
HANDLE CreateSemaphore(  )
HANDLE CreateFileMapping(  )
创建失败之后返回值为 NULL(0)或者 INVALID_HANDLE_VALUE(-1),只有调用 CreateFile函数时才能将返回值与 INVALID_HANDLE_VALUE进行比较。
句柄创建失败时GetLastError()返回 ERROR_INVALID_HANDLE
3、跨越进程边界共享内核对象:
(1) 文件映射对象可跨进程共享数据块
(2) 邮槽和管道能在联网的不同机器上运行的线程之间发送数据块
(3) 互斥对象、信标和事件能够同步不同线程中的数据共享。
4、内核对象句柄的继承性
内核对象本身不具有继承性,但是 其句柄具有继承性。只有当进程具有 父子关系时,才能使用对象句柄的继承性。父进程可以为子进程赋予对父进程内核对象的访问权。这个过程需要经过几个步骤:
(1)父进程创建内核对象时 必须向系统指明它希望对象句柄可继承,这通过制定一个 SECURITY_ATTRIBUTES结构并对他进行初始化,然后将该结构的地址传递给特定的 Create函数。如下所示:
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof( sa );
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
HANDLE hMutex = CreateMutex(&sa, FALSE, NULL);
(2)由父进程生成子进程,使用 CreateProcess函数完成,其参数BOOL  bInheritHandles为真时子进程就可以继承父进程的可继承句柄值。
5、改变句柄的标志
父进程创建的句柄分给两个子进程中的一个来继承,调用 SetHandleInformation函数。
SetHandleInformation(hobj, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
HANDLE_FLAG_PROTECT_FROM_CLOSE标志用于告诉系统 该进程不应被关闭(父进程和孙进程之间的通信)
6、共享 跨越边界的内核对象的第二种方法是 给对象命名。很多内核对象都是可以命名的,PCTSTR pszName变量如果赋值为NULL就向系统指明了想创建一个未命名的内核对象。未命名的对象可以通过 父类继承性和DuplicateHandle共享跨越进程的对象。如果按照名字共享对象,必须为对象赋予一个名字。
HANDLE hMutexProcessA = CreateMutex(NULL, FALSE, "AMutex");
HANDLE hMutexProcessX = CreateSemaphore(NULL,1,1,"AMutex");
DWORD dwErrorCode = GetLastError();
不同类型句柄创建函数 使用同一个名字会造成除第一个之外的对象创建失败。
HANDLE hMutexProcessB = CreateMutex(NULL, FALSE, "AMutex");
在不同进程不同程序内的创建因为系统检索到该命名对象已经被创建,系统会执行一次安全监察以确定调用者是否拥有对该对象的完整的访问权。如果安全检查通过系统会在ProcessB的句柄表中找到一个空项目并进行初始化,使该项目指向现有的内核对象。如果该对象类型不匹配,或调用者被拒绝访问那么CreateMutex将运行失败。
按名字共享对象的另一种方法是采用 Open*函数完成调用。
7、复制内核对象句柄
使用DuplicateHandle函数取出一个 进程的句柄表中的项目,并将该项目拷贝到另一个进程的句柄表中。 DuplicateHandle函数具有若干个参数,第一个和第三个参数hSourceProcessHandle和hTargetProcessHandle是内核对象句柄

你可能感兴趣的:(MFC 内核对象用法简略)