检查COM指针是否相等

时间:2014-05-01 07:29:04

标签: c++ com

如果我有两个COM接口指针(即ID3D11Texture2D),并且我想检查它们是否是相同的底层类实例,我可以直接比较这两个指针是否相等?我已经看到了代码,我们在比较完成之前将其转换为其他东西,所以想要确认。

BOOL IsEqual (ID3D11Texture2D *pTexture1, ID3D11Texture2D *pTexture2)
{
    if (pTexture1 == pTexture2)
    {
        return true;
    }
    else
    {
        return false;
    }
} 

感谢。

1 个答案:

答案 0 :(得分:8)

正确的COM方式是使用IUnknown查询接口。来自MSDN中的评论here的引用:

  

对于任何一个对象,任何IUnknown接口的特定查询   对象的接口必须始终返回相同的指针值。   这使客户端能够确定两个指针是否指向   通过使用IID_IUnknown和调用QueryInterface来调用相同的组件   比较结果。查询的具体情况并非如此   对于IUnknown以外的接口(甚至是相同的接口)   相同的指针)必须返回相同的指针值。

所以正确的代码是

BOOL IsEqual (ID3D11Texture2D *pTexture1, ID3D11Texture2D *pTexture2)
{
    IUnknown *u1, *u2;

    pTexture1->QueryInterface(IID_IUnknown, &u1);
    pTexture2->QueryInterface(IID_IUnknown, &u2);

    BOOL areSame = u1 == u2;
    u1->Release();
    u2->Release();

    return areSame;
}

<强>更新

  1. 添加了对Release的调用,因此减少了引用计数。感谢您的好评。
  2. 您也可以使用ComPtr完成此项工作。请查看MSDN。