2014-01-10 43 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