您的位置:首页 > 其它

跨进程共享内核对象方法:命名对象

2016-08-29 13:53 267 查看
下面的所有函数都可以创建命名的内核对象:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: