D3D 和 COM 问题
-
23-09-2019 - |
题
所有 D3D 接口均派生自 COM 的 IUnknown 接口,因此我想采用一种简单的方法来释放 D3D 对象并使用如下所示的方法:
__inline BOOL SafeRelease(IUnknown*& pUnknown)
{
if(pUnknown != NULL && FAILED(pUnknown->Release()))
return FALSE;
pUnknown = NULL;
return TRUE;
}
但这不起作用,因为当我尝试使用它时,编译器将生成无效的类型转换错误。我能想到的唯一解决方法是:
__inline BOOL SafeRelease(void* pObject)
{
IUnknown* pUnknown = static_cast<IUnknown*>pObject;
if(pUnknown != NULL && FAILED(pUnknown->Release()))
return FALSE;
return TRUE;
}
但后来我失去了一些功能,而且它看起来(而且确实)非常狡猾。有一个更好的方法吗?像我的第一个例子一样工作的东西将是最佳的,尽管我想避免使用任何宏(如果可能的话)
解决方案
一个模板函数解决您的问题:
template<class T>
__inline bool SafeRelease(T*& pUnknown)
{
if (pUnknown == NULL) return false;
if (0 == pUnknown->Release())
pUnknown = NULL;
return true;
}
其他提示
如果你可以做你原来写,那么你就违反类型安全:
IDirect3DDevice *blah;
IUnknown *bar;
IUnknown *&unknown= blah;
unknown= bar;
显然,bar
分配unknown
将意味着blah
指向一个IUnknown
,这将违反类型安全。
nobugz的解决方案可能是你想要做什么,但我会认为设置这些指针为NULL不会提高代码的质量。如果您需要确保其他代码不会Release
多次,你应该去修复这些代码,而不是让bug的代码不会失败。
我还没有与DirectX在一段时间工作,但我记得它有它的头一个SAFE_RELEASE
宏地方。谷歌代码搜索显示它在dxutil.h
。
不隶属于 StackOverflow