2017-03-24 26 views

답변

3

결코 그걸 돌려주지 않을 것 같습니다. E_FAILE_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; 
}; 
+0

나는 이전 버전의 ATL이 특정 예외를'E_FAIL' ('__try' 및 친구들)로 변환했다는 인상을 받았습니다. 이것은 어느 시점에서 제거되어야합니다. –

+1

vc90 (2008)에서는 Init()의 InitializeCriticalSection()에'__try'가 있지만 'Lock()'에는 SEH가 없습니다. –

+0

최신 버전에서는'Init()'을 조정할 수 있지만 SAL 주석 추가 이외의 2008 년 이후로는 Lock() 및 Unlock()이 변경되지 않았습니다. –