描述:
COM进程外服务器实现 QueryInterface时,这样的代码为什么不行?
HRESULT QueryInterface( REFIID riid, void **ppv)
{
.....
if( riid == MYIID1 || riid== MYIID2 .... ) { /// MYIIDX
是该对象实现的接口
*ppv= this; ////1
}
.....
}
客户QueryInterface成功后却无法调用MYIIDX的方法。
这样写才可以:
HRESULT QueryInterface( REFIID riid, void **ppv)
{
.....
if( riid == MYIID1 ) {
*ppv= (MY_IID1*) this;
} else if( riid == MYIID2 ) {
*ppv= (MY_IID2*) this;
}
.....
}
(MY_IIDX*) this,这个转换到底起什么作用呢?我试了一下,如果不是COM,
在一个程序内是没有什么作用的。
解决方案1:
其实我不建议你使用
(MY_IIDX*) this
而应当使用
static_cast<MY_IIDX*>(this)
顺带一提:
不过你用 reinterpret_cast 就是同你心目中想的是一样的了。
所以很多书上说 reinterpret_cast 要谨用。
struct A{ virtual Haha(){} };
struct B : public A {};
struct C : public A {};
struct D : public B , public C {};
int main()
{
D* value = new D();
cout << (int)(B*)(value) << endl;
cout << (int)(C*)(value) << endl;
return 0;
}
(MY_IIDX*) this 的作用就是把本对象指针转换为MY_IIDX类型的对象指针,其中涉及到c++多重继承的布局结构,可以看一下《深度探索c++对象模型》这本书。
您可能想查找下面的文章:
- 如何修改ATL自动生成的COM方法呢?比如QueryInterface,CreateInstence
- 重写QueryInterface,AddRef,Release应该注意些什么?我这段代码怎么总是有问题。
- 使用COM组件时,QueryInterface调用失败是什么原因
- tempRs->QueryInterface__uuidof_Recordset,voidm_Recordset编译没错,vb调用报自动化错误
- 在线等待关于queryinterface的问题
- 关于QueryInterface,求助啊!
- 奇怪:成功激活也能成功调用,为什么queryinterface查询第二个接口报告“拒绝访问”?
- 为什么Queryinterface返回的IUnknown指针总是相同的
- 求QueryInterface例子
- 请问QueryInterface有什么用呢?