当CComCriticalSection :: Lock可能返回E_FAIL时

时间:2017-03-24 15:39:14

标签: c++ com atl

MSDN(https://msdn.microsoft.com/en-us/library/04tsf4b5.aspx)说:

  

返回值

     

成功时返回S_OK,E_OUTOFMEMORY或E_FAIL开启   故障。

获取锁定可能会失败?

1 个答案:

答案 0 :(得分:3)

看起来它永远不会回归。只要方法返回E_FAIL,对E_OUTOFMEMORYHRESULT的引用可能是标准注释。此方法可能返回HRESULT以与其他方法保持一致和/或与其他ATL类兼容。

以下是vc140(2017)工具集中CComCriticalSection的代码。回到vc90(2008)的先前工具集具有类似的简单Lock()方法。 2008年和2017年之间唯一的变化是添加了SAL属性_Success__Acquires_lock_,它们没有任何功能影响(它们扩展为空)。我不能在2008年之前评论工具集。

class CComCriticalSection
{
public:
    CComCriticalSection() throw()
    {
        memset(&m_sec, 0, sizeof(CRITICAL_SECTION));
    }

    ~CComCriticalSection()
    {
    }

    _Success_(1) _Acquires_lock_(this->m_sec) HRESULT Lock() throw()
    {
        EnterCriticalSection(&m_sec);
        return S_OK;
    }
    _Success_(1) _Releases_lock_(this->m_sec) HRESULT Unlock() throw()
    {
        LeaveCriticalSection(&m_sec);
        return S_OK;
    }
    HRESULT Init() throw()
    {
        HRESULT hRes = S_OK;
        if (!_AtlInitializeCriticalSectionEx(&m_sec, 0, 0))
        {
            hRes = HRESULT_FROM_WIN32(GetLastError());
        }

        return hRes;
    }

    HRESULT Term() throw()
    {
        DeleteCriticalSection(&m_sec);
        return S_OK;
    }
    CRITICAL_SECTION m_sec;
};