重新解释转换IDXGISwapChain **指向IUKnown的指针**指针

时间:2016-02-02 00:20:48

标签: c++ casting directx

我想做以下reinterpret_cast操作:

rawType,其中ppSwapChain1的类型为IUnknown **ppIUnknown = reinterpret_cast<IUnknown**>(ppSwapChain1);我计划稍后IDXGISwapChain1**. QueryInterfaceIDXGISwapChain来自IDXGISwapChain1;

IDXGISwapChain1通过以下层次结构从*ppIUnknown继承。

IUnknown - &GT; IDXGISwapChain1      - &GT; IDXGISwapChain          - &GT; IDXGIDeviceSubObject              - &GT; IDXGIObject

reinterpret_cast是合法且定义的操作吗?我不确定,并希望得到关于这个主题的反馈。我无法找到涵盖此特定问题的现有主题。

感谢。

1 个答案:

答案 0 :(得分:0)

这是一个“强制转换”,绝不需要reinterpret_castdynamic_cast。您可以简单地使用static_cast,因为您正在向上移动类型层次结构。您还可以安全地调用一个函数,该函数直接使用IUnknown* IDXGISwapChain对象,而不必完全投射它,因为公共继承允许这样做。

auto *iunk = static_cast<IUnknown*>( swapChain1 );

请记住,这实际上并没有增加底层对象的引用计数。您必须致电AddRef或使用Microsoft::WRL::ComPtr

Microsoft::WRL::ComPtr<IUnknown*> iunk( swapChain1 );

你必须小心谨慎。

对于普通的C ++指针,您可以使用运行时类型信息(RTTI)并使用dynamic_cast来验证类型在运行时实际上是否可转换,并处理可能的nullptr,如果类型不是兼容。或者你可以使用reinterpret_cast如果你只想强制指针指向另一种类型,程序员可以确保结果始终有效。

使用COM,您使用QueryInterface,它在功能上与dynamic_cast相同,以查看给定的COM对象是否支持特定接口。或者更好的是,使用Microsoft::WRL::ComPtrAs运算符。

Microsoft::WRL::ComPtr<IDXGISwapChain1> swapChain1;
HRESULT hr = iunk.As( &swapChain1 );
if ( SUCCEEDED(hr) )
{
    // swapChain1 is now a valid pointer to the COM object with another ref
}