跨进程共享内核对象方法:命名对象
2016-08-29 13:53
267 查看
下面的所有函数都可以创建命名的内核对象:
CreateMutex,CreateEvent,CreateFileMapping,
CreateSemaphore,CreateWaitableTimer,CreateJobObject。
他们都包含了一个 PSLCURITY_ATTRIBUTES psa 参数表示安全描述符,用以描述内核对象的安全性。它描述了内核对象的拥有者。大部分情况下都是传入NULL,表示使用默认的安全性。
一:所有这些对象都共享单个名空间,所以创建相同名字的对象会返回对象已存在的错误。
二:调用上面Create*系列函数与调用Open*系列函数之间的主要差别
如果对象并不存在,那么Create*函数将创建该对象,而Open*函数则返回失败。
三:使用命名对象来共享对象
四:其他
1:复制对象句柄 Duplicatehandle
2:对同一个命名对象CreateEvent的调用取得成功时,对命名对象的使用计数就会递增。它并不一定实际创建一个命名对象,只是被赋予一个与进程相关的句柄值,用于标识内核中现有的命名对象。
3:创建命名对象后返回的这个句柄并不一定跟其他进程返回的句柄相同,原因是句柄仅仅是独立于每个进程的句柄表的一个索引,它引用的是自己打开的的内核对象。
参考:
跨越进程边界共享内核对象【命名对象】
http://www.cnblogs.com/fangyukuan/archive/2010/08/31/1813733.html
谈谈内核对象及句柄的本质
http://blog.csdn.net/ithzhang/article/details/7927682
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
相关文章推荐
- mongodb中的索引二
- 配置控制台程序以管理员方式自动启动
- iOS下JS与OC互相调用(六)--WKWebView + WebViewJavascriptBridge
- 马哥运维班第四周作业
- CSS位置如何获取的
- 打算给自己两个月的时间把论文发出来,加油
- xml类型转换列表显示 SQL查询
- LeetCode 二叉树的最小深度
- 获取到Android控件的高度
- Jenkins持续集成入门
- bootloader---9.点亮led
- android-support-v4.jar的过多导致android应用未能成功实现
- 横向滚动的ListView并且点击item附带item的背景改变
- linux下安装或升级GCC 4.8,以支持C++11标准
- iOS下JS与OC互相调用(五)--UIWebView + WebViewJavascriptBridge
- iOS下JS与OC互相调用(五)--UIWebView + WebViewJavascriptBridge
- 百度插件ueditor
- MongoDB 3.X 用户权限控制
- bootloader---8.start.S中关于bl指令的理解
- bootloader---7.start.S中relocate部分分析,adr与ldr区别