如果我有两个COM接口指针(即ID3D11Texture2D),并且我想检查它们是否是相同的底层类实例,我可以直接比较这两个指针是否相等?我已经看到了代码,我们在比较完成之前将其转换为其他东西,所以想要确认。
BOOL IsEqual (ID3D11Texture2D *pTexture1, ID3D11Texture2D *pTexture2)
{
if (pTexture1 == pTexture2)
{
return true;
}
else
{
return false;
}
}
感谢。
答案 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;
}
<强>更新强>