簡體   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