MSDN (https://msdn.microsoft.com/en-us/library/04tsf4b5.aspx) dit:CComCriticalSection :: Lock peut retourner E_FAIL
Valeur de retour
retour S_OK sur le succès, E_OUTOFMEMORY ou E_FAIL sur échec.
Quelle est la panne d'un verrou?
MSDN (https://msdn.microsoft.com/en-us/library/04tsf4b5.aspx) dit:CComCriticalSection :: Lock peut retourner E_FAIL
Valeur de retour
retour S_OK sur le succès, E_OUTOFMEMORY ou E_FAIL sur échec.
Quelle est la panne d'un verrou?
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;
};
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é. –
Dans vc90 (2008), il existe un '__try' autour de' InitializeCriticalSection() 'dans' Init() ', mais le' Lock() 'n'a pas de SEH. –
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. –
juste deviner, l'échec d'appeler '.init()' (ou '.init()' défaut) ou utiliser après avoir appelé '.term()'. –