繁体   English   中英

D3D和COM问题

[英]Problem with D3D & COM

所有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;
} 

但是后来我失去了一些功能,而且看起来也很狡猾。 有一个更好的方法吗? 虽然我想避免使用任何宏(如果可能的话),但与我的第一个示例类似的东西将是最佳的

处理COM资源的常用途径是使用RAII,并让诸如CComQIPtr CComPtrCComQIPtr类的帮助程序类尽可能多地为您处理引用计数。

void f() {
    CComPtr<IDirect3DDevice> sp3dDev;
    getDevice(&sp3dDev);
    // ... do stuff
} // smart pointer gets destroyed, calls Release() if valid

模板函数可以解决您的问题:

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 ,则可能应该修复该代码,而不是使出错的代码不会失败。

我已经有一段时间没有使用DirectX了,但我记得它的标头中有一个SAFE_RELEASE宏。 Google代码搜索显示它位于dxutil.h

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM