toutes les interfaces D3D sont dérivées de l'interface IUnknown COM, donc je pensais que je prendrais un itinéraire facile pour libérer des objets D3D et utiliser quelque chose comme ceci:problème D3D & COM
__inline BOOL SafeRelease(IUnknown*& pUnknown)
{
if(pUnknown != NULL && FAILED(pUnknown->Release()))
return FALSE;
pUnknown = NULL;
return TRUE;
}
cela ne fonctionne bien, car le compilateur va générer des erreurs de conversion de type non valide, lorsque j'essaie de l'utiliser. la seule façon autour d'elle que je pouvais penser était le suivant:
__inline BOOL SafeRelease(void* pObject)
{
IUnknown* pUnknown = static_cast<IUnknown*>pObject;
if(pUnknown != NULL && FAILED(pUnknown->Release()))
return FALSE;
return TRUE;
}
mais je lâche certaines fonctionnalités et il semble aussi (et est) très douteux. Y a-t-il une meilleure manière de faire cela? quelque chose qui fonctionne comme mon premier exemple serait optimale, bien que je voudrais éviter d'utiliser des macros (si son possible)
Le code dans la question et dans cette réponse est incorrect. IUnknown :: Release() renvoie un ULONG, pas un HRESULT. Le ULONG est généralement le refcount de l'objet. Ce n'est pas un indicateur de savoir si le Release() a réussi ou échoué. Voir la documentation IUnknown :: Release() à l'adresse http://msdn.microsoft.com/en-us/library/ms682317(VS.85).aspx – Ants
@ants: Je suivais simplement les commentaires dans WinError. h: '// La valeur de retour des fonctions COM et des méthodes est un HRESULT. ' devinez alors cela est corrigé alors aussi, merci de le signaler :) – Necrolis