下面的所有函数都可以创建命名的内核对象:
CreateMutex,CreateEvent,CreateFileMapping,
CreateSemaphore,CreateWaitableTimer,CreateJobObject。
他们都包含了一个 PSLCURITY_ATTRIBUTES psa 参数表示安全描述符,用以描述内核对象的安全性。它描述了内核对象的拥有者。大部分情况下都是传入NULL,表示使用默认的安全性。
一:所有这些对象都共享单个名空间,所以创建相同名字的对象会返回对象已存在的错误。
HANDLE hMutex = CreateMutex(NULL. FALSE, "Global\\Stop_Event");
HANDLE hSem = CreateSemaphore(NULL, 1, 1, "Global\\Stop_Event");
DWORD dwErrorCode = GetLastError(); //返回ERROR_ALREADY_EXISTS
二:调用上面Create*系列函数与调用Open*系列函数之间的主要差别
如果对象并不存在,那么Create*函数将创建该对象,而Open*函数则返回失败。
三:使用命名对象来共享对象
//创建共享对象
SECURITY_DESCRIPTOR sd = {0};
SECURITY_ATTRIBUTES sa = {0};
::InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
::SetSecurityDescriptorDacl(&sd,TRUE,NULL,FALSE);
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = &sd;
sa.bInheritHandle = TRUE;
HANDLE m_hMutex_Stop = ::CreateEvent (&sa, TRUE, FALSE, _T("Global\\Stop_Event"));
if (m_hMutex_Stop != NULL)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
::CloseHandle(m_hMutex_Stop);
return;
}
}
//打开共享对象
HANDLE hEvt = ::OpenEvent (EVENT_ALL_ACCESS , TRUE, _T("Global\\Stop_Event"));
四:其他
1:复制对象句柄 Duplicatehandle
2:对同一个命名对象CreateEvent的调用取得成功时,对命名对象的使用计数就会递增。它并不一定实际创建一个命名对象,只是被赋予一个与进程相关的句柄值,用于标识内核中现有的命名对象。
3:创建命名对象后返回的这个句柄并不一定跟其他进程返回的句柄相同,原因是句柄仅仅是独立于每个进程的句柄表的一个索引,它引用的是自己打开的的内核对象。
参考:
跨越进程边界共享内核对象【命名对象】
http://www.cnblogs.com/fangyukuan/archive/2010/08/31/1813733.html
谈谈内核对象及句柄的本质
http://blog.csdn.net/ithzhang/article/details/7927682