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

本文介绍如何通过Create*系列函数创建命名内核对象,包括互斥量、事件、文件映射等,并探讨这些对象如何在一个共享名称空间中工作。此外,还介绍了如何使用安全描述符设置对象权限,以及如何通过Open*函数打开已存在的命名对象。
摘要由CSDN通过智能技术生成

下面的所有函数都可以创建命名的内核对象:
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值