MSDN을 반환 할 때 (https://msdn.microsoft.com/en-us/library/04tsf4b5.aspx)는 말한다 :는 CComCriticalSection :: 잠금 E_FAIL
반환 값
반환이 실패에 성공, E_OUTOFMEMORY 또는 E_FAIL에 S_OK.
잠금을 획득 할 때 어떤 실패가있을 수 있습니까?
MSDN을 반환 할 때 (https://msdn.microsoft.com/en-us/library/04tsf4b5.aspx)는 말한다 :는 CComCriticalSection :: 잠금 E_FAIL
반환 값
반환이 실패에 성공, E_OUTOFMEMORY 또는 E_FAIL에 S_OK.
잠금을 획득 할 때 어떤 실패가있을 수 있습니까?
결코 그걸 돌려주지 않을 것 같습니다. E_FAIL
및 E_OUTOFMEMORY
에 대한 참조는 메소드가 HRESULT
을 반환 할 때마다 표준 주석이 될 가능성이 큽니다. 이 메서드는 다른 메서드와의 일관성 및/또는 다른 ATL 클래스와의 호환성을 위해 HRESULT
을 반환합니다.
다음은 vc140 (2017) 툴 세트의 CComCriticalSection
코드입니다. 이전의 vc90 (2008) 도구 세트는 비슷하게 간단한 Lock()
메서드를 사용합니다. 2008 년과 2017 년 사이의 유일한 변화는 SAL 속성 인 _Success_
과 _Acquires_lock_
의 추가였습니다. 기능상의 영향은 없었습니다 (아무 것도 펼치지 않았습니다). 나는 이전
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;
};
나는 이전 버전의 ATL이 특정 예외를'E_FAIL' ('__try' 및 친구들)로 변환했다는 인상을 받았습니다. 이것은 어느 시점에서 제거되어야합니다. –
vc90 (2008)에서는 Init()의 InitializeCriticalSection()에'__try'가 있지만 'Lock()'에는 SEH가 없습니다. –
최신 버전에서는'Init()'을 조정할 수 있지만 SAL 주석 추가 이외의 2008 년 이후로는 Lock() 및 Unlock()이 변경되지 않았습니다. –
2008 그냥 전화, 실패를 추측에 도구 세트에 대해 말씀 드릴 수 없습니다'.Init() '(또는'.Init()'실패) 또는 호출 한 후 사용'.Term()'. –