所有D3D接口(interface)都是从COM的IUnknown接口(interface)派生的,因此尽管我会采取一种简单的方法来发布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;
}

关于c++ - D3D和COM问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2350531/

10-10 10:10