2014-01-10 47 views
0

我指的是「非託管」/桌面C++目標應用程序的所有MSDN教程如何超越Direct3D是COM接口的事實使用甚至不提及COM。我是通過大量的搜索(包括閱讀其他目標的其他MSDN文檔 - 如RT)我確定我絕對應該使用COM助手。是否有使用Direct3D COM的參考?

我找到了COM智能指針(_com_ptr_t和它的夥伴_COM_SMARTPTR_TYPEDEF)的引用,但沒有其他更多。

我還需要了解COM如何使用它? 對MSDN Direct3D教程的要求只是陳述C++的經驗和數學。

我不覺得我很困惑哪個智能指針可以再使用(因爲這是另一個常見問題),但是我擔心作爲一個新的COM程序員,可能會有其他重要信息丟失。

另外,顯然其他COM接口爲程序員定義了它們自己的指針類型定義。這是否也適用於Direct3D?現在我只使用_COM_SMARTPTR_TYPEDEF並定義我自己的。

+0

'我確定我絕對應該使用COM助手。「爲什麼?在我看到之後,它不是非常直觀,而且過時。我看不出爲什麼你需要將它用於Direct3D開發。 – olevegard

+0

調用它COM是一個很大的延伸。這是基於IUnknown的,就是這樣。你不會錯過任何東西,_com_ptr_t很好,CComPtr或WRL的ComPtr也是如此。 –

+0

@olevegard這是Direct3D(et。al。)世界全新的人的自我決定。我可能會稍微延伸一點,意思是說作爲一名C++程序員,我想使用智能指針,而不是MSDN教程中使用的示例(這些示例都是裸指針)。 – chrisp

回答

0

我個人建議在wrl.hComPtr爲你的智能COM指針。對於D3D,除了通過AddRefRelease以及知道何時使用偶爾的QueryInterface(例如從ID3D11Device得到ID3D11Debug),您不需要知道多少COM。 D3D11特有的唯一事情是D3D對象的生命週期是其實際COM生命週期(即引用計數大於零的時間段)中較大的一個,以及它或其依賴關係存在或綁定到D3D的時間段管道。

例如:

CreateTexture(&tex) // tex refcount = 1 
CreateShaderResourceView(tex, &srv) // srv refcount = 1, tex internal refcount = 2 
tex->Release() // tex refcount = 0, internal refcount = 1 (so not released) 
srv->Release() // srv refcount = 0, released; tex internal refcount = 0, released 

當然,智能指針自動調用AddRefRelease爲對象引用複製或超出範圍。如果您不熟悉API並且不想擔心忘記發佈某些內容(D3D的內部參考跟蹤確保您無法刪除當前正在使用的某些內容),那麼它們絕對是一個好主意。但對於更高級的程序,您需要更精確地定位對象分配和釋放(而不僅僅是範圍更改),因此需要手動管理它。

+0

是否有使用wrl.h(作爲WinRT)的附加依賴項?爲什麼比使用_com_ptr_t更好? – chrisp

+0

@jacobsd不應該有任何依賴關係 - 它只是頭文件中的模板。 WRL與WinRT兼容,但不需要它。在Win32桌面應用程序中使用它是完全有效的。 – MooseBoys

+0

感謝您的建議。有沒有很好的理由通過_com_ptr_t來使用它? – chrisp