MSDN(https://msdn.microsoft.com/en-us/library/04tsf4b5.aspx)说:
返回值
成功时返回S_OK,E_OUTOFMEMORY或E_FAIL开启 故障。
获取锁定可能会失败?
答案 0 :(得分:3)
看起来它永远不会回归。只要方法返回E_FAIL
,对E_OUTOFMEMORY
和HRESULT
的引用可能是标准注释。此方法可能返回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;
};