使用QueryInterface方法的目的是什么?(Direct3D)

9
我了解 QueryInterface 方法的作用 - 它只返回指向特定接口的指针。但我的问题是,我为什么要使用这个方法?
我的意思是,QueryInterface(__uuidof(IDXGIResource), (void**)&Resource)IDXGIResource * Resource 有什么区别吗?如果相同,那我为什么需要使用这个方法呢?在什么情况下应该使用它?

想象一下“多重继承”。给定一个类型的对象,它允许您查询它是否也是另一个类型的对象。 - Jonathan Potter
哦,我明白了。所以从某种意义上说,它基本上是一个指向不同接口的指针,对吧?如果我这样做 device->CreateTexture2D(&SharedTextureDesc, NULL, &SharedTexture); SharedTexture->QueryInterface(__uuidof(IDXGIResource), (void**)&SharedResource); 这意味着首先,SharedResource 指针现在将指向 SharedTexture 所指向的纹理,对吗? - Soon_to_be_code_master
2
你可以将QueryInterface视为COM中的dynamic_cast,并记住它可能会失败,因此一定要检查HRESULT以避免错误。与其直接使用QueryInterface,不如考虑使用Microsoft::WRL::ComPtr智能指针,然后使用As方法,这样可以将其封装在更自然的C++语法中。 - Chuck Walbourn
1个回答

12

COM假设一个单独的对象将提供多个接口,即这些接口将是细粒度的,并且您希望同时使用其中的多个接口。 QueryInterface 是您获取对象上其他接口指针的方法。

你的例子不完整。第一个示例没有展示QueryInterface是如何从现有接口调用的,而第二个示例没有为指针分配任何值(它是未初始化的指针)。一个实际的例子会结合两者:

IDXGIResource * Resource = NULL;
pInterface->QueryInterface(__uuidof(IDXGIResource), (void **)&Resource);
为了保证健壮性,您应该确保在尝试使用指针之前 QueryInterface 调用已经成功
if (SUCCEEDED(pInterface->QueryInterface(__uuidof(IDXGIResource), (void **)&Resource))
    Resource->DoSomething();

非常感谢您的解释! - Soon_to_be_code_master

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接