2017-03-24 1 views

Répondre

3

Il semble que ça ne retournera jamais cela. Les références à E_FAIL et E_OUTOFMEMORY sont des commentaires standard probables lorsque les méthodes retournent un HRESULT. Cette méthode renvoie probablement un HRESULT pour la cohérence avec d'autres méthodes et/ou la compatibilité avec d'autres classes ATL.

Voici le code pour CComCriticalSection dans le jeu d'outils vc140 (2017). Les anciens jeux d'outils de la version vc90 (2008) ont des méthodes Lock() similaires. Les seuls changements entre 2008 et 2017 ont été l'ajout des SAL attributs _Success_ et _Acquires_lock_, qui n'ont aucun impact fonctionnel (ils s'étendent à rien). Je ne peux pas commenter pour toolsets avant 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; 
}; 
+0

Je suis sous l'impression que les versions précédentes d'ATL ont converti certaines exceptions à 'E_FAIL' (' __try' et amis). Cela aurait dû être supprimé à un moment donné. –

+1

Dans vc90 (2008), il existe un '__try' autour de' InitializeCriticalSection() 'dans' Init() ', mais le' Lock() 'n'a pas de SEH. –

+0

Les versions ultérieures tweak 'Init()', mais 'Lock()' et 'Unlock()' n'ont pas changé depuis 2008 au moins, autre que l'ajout des annotations SAL. –