gpt4 book ai didi

c++ - 我如何知道一个 COM 对象与不同的 COM UUIDS 兼容?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:37:46 27 4
gpt4 key购买 nike

基于 MSDN for Direct 3D 11 Graphics,文档部分“如何创建即时上下文”显示了以下代码:

ID3D11Texture2D* pBackBuffer;
// Get a pointer to the back buffer
hr = g_pSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ),
( LPVOID* )&pBackBuffer );

这里调用的pBackBuffer是类型ID3D11Texture2D。GetBuffer 方法的文档 ( https://learn.microsoft.com/en-gb/windows/win32/api/dxgi/nf-dxgi-idxgiswapchain-getbuffer )将第二个参数描述为 REFIID(用于操作缓冲区的接口(interface)类型),将第三个参数描述为 void** 指向后台缓冲区接口(interface)的指针。

现在,关于 Direct2d 的文档中的不同部分显示了以下代码片段,用于将 Direct2d 内容写入 Direct3d 缓冲区:

 hr = m_pSwapChain->GetBuffer(
0,
IID_PPV_ARGS(&pBackBuffer)
);

此处 BackBuffer 在 CreateDxgiSurfaceRenderTarget 中用作第一个参数,它是一个 IDXGISurface,这意味着我得到的 Backbuffer 是一个 IDXGISurface。

当 MSDN 仅将参数描述为 REFIID(见上文)时,我怎么知道我可以将 ID3D11Texture2DIDXGISurface 传递给 GetBuffer 方法?我怎样才能弄清楚我可以在那里传递什么?

最佳答案

TL;DR:阅读 Microsoft 文档文章 Programming DirectX with COM .

DirectX API 使用“精简”形式的 COM,因此它们没有完全实现组件对象模型 (COM) 的所有可能功能:

  • 他们使用 IUnknown 在生命周期内使用引用计数但这是一个修改后的形式,其中 IDeviceChild当它们的父级 IDevice 时,所有对象都将立即无效接口(interface)全面发布。您可以使用 AddRefRelease , 尽管对于 C++ 你最好使用像 ComPtr 这样的东西.

  • DirectX API 不支持“单线程单元”

  • 一些 DirectX API 不支持 CoCreateInstance并且必须通过特定的工厂 API 创建。

  • 他们没有实现聚合。

  • DirectX API 通常不实现进程外/远程进程行为

对于您的问题,DirectX API 通常支持有限数量的接口(interface),您使用 QueryInterface来“贬低”他们。给定的 DirectX 对象将支持 IUnknown ,以及该系统层次结构中每个类的 IID(即如果它是 ID3D11Device2 那么它将支持 ID3D11Device1ID3D11Device )。使用 C++,您通常只使用继承来提升层次结构,但您可以使用 QueryInterface .

否则,只有少数对象支持多个接口(interface)的特定情况,例如 DXGI 与 Direct3D 互操作 swapchainsdevice-shared textures .换句话说,大多数情况会导致 E_NOINTERACE .

另见 The Component Object ModelReference Counting (Direct3D 10) ,

关于c++ - 我如何知道一个 COM 对象与不同的 COM UUIDS 兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58518810/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com