请edyang,vcmfc,iamafraid,horris,EGE等大虾(呵呵,排名不分先后)来看看 QueryInterface的问题

HWLee 2001-06-26 06:15:45
我的com组件友三个接口:IFoo1,IFoo2,IFoo3。
如果分别用CoCreateInstance(CLSID_FooX,NULL,CLSCTX_INPROC_SERVER,
IID_IFooX,(void **) &pFooX);可以得到pFoo1,pFoo2,pFoo3指针。
但如果得到pFoo1后:
IFoo2 * pFoo2;
IFoo3 * pFoo3;
HRESULT hr = pFoo1->QueryInterface(IID_IFoo2,(void **) &pFoo2);
HRESULT hr = pFoo1->QueryInterface(IID_IFoo3,(void **) &pFoo3);
却得不到pFoo2和pFoo3指针。pFoo2,pFoo3均为NULL。
IUnknown * pUnknown;
HRESULT hr = pFoo1->QueryInterface(IID_IUnknown,(void **) &pUnknown);
可以得到pUnknown指针。为什么呀!

请高手指点.......


...全文
193 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
horris 2001-06-28
  • 打赏
  • 举报
回复
to HWLee(思我所思,爱我所爱!):
那么怎样才能得到pFoo2以及pFoo3呢。
>我已经告诉过你了:
p1.CreateInstance("ProgID or CLSID");
p2=p1;
//or: p1.QueryInterface(IID_Foo2,&p2);
//注意最好不要用p1->QueryInterface,因为p1,p2,p3是_com_ptr_t的类!
我认为解决这个问题根本用不着aggregation,ATL生成的类完全可以是多接口的,也不必是IDispatch或dual interface(接口不从IDispatchImpl派生)。
用CoCreateInstance是错误的,每用一次就生成一个新的对象,但是至少QueryInterface应该是不会出错的,问题恐怕在server上。
用_com_ptr_t类,可以直接向我上面
HWLee 2001-06-28
  • 打赏
  • 举报
回复
谢谢以上各位的指点,问题已经搞清楚。

Elminster 2001-06-27
  • 打赏
  • 举报
回复
用调试工具单步跟踪进 QueryInterface 看看,大半可以找到问题所在。
HWLee 2001-06-27
  • 打赏
  • 举报
回复
问题:如果class CA: public IFoo1,public IFoo2,而没有继承IFoo3。会不会通过IFoo1
QueryInterface不到IFoo3。
另外,#import "..\..\test.dll" no_namespace named_guids import 了什么?:-(我很菜的:-(
HWLee 2001-06-27
  • 打赏
  • 举报
回复
to Elminster():
怎么调试呀?怎么能够单步跟踪进QueryInterface?
wyzegg 2001-06-27
  • 打赏
  • 举报
回复
HRESULT hr = pFoo1->QueryInterface(IID_IFoo2,(void **) &pFoo2);
如果用ATL做的,pFoo1的指向的对象根本没有接口IFoo2,IFoo3。所以返回的结果会是NOINTERFACE吧,如果你Query,IDispatch的接口的话会有的,一般都继承啦IDispatch的。
至于CoCreateInstance这个函数中你提供啦IID_IFoo2啦,他会创建一个IID_IFoo2的对象,然后得到指针。事实上就是不能得到的。除非你的对象一次继承这三个接口。其实看看用SDK写的COM,我想一下就明白啦

不好意思,冒昧啦

vcmfc 2001-06-27
  • 打赏
  • 举报
回复
最近忙且上不了网,可能不能常来了。
vcmfc 2001-06-27
  • 打赏
  • 举报
回复
这是我的茁见,不知道你有没有在你的IFoo1中使用聚合???????
vcmfc 2001-06-27
  • 打赏
  • 举报
回复
其实你只要在IFoo1组件中聚合IFoo2,IFoo3组件接口就可以实现你上面的代码。

《ATL开发指南》2/e的聚合部分。
xyjiao 2001-06-27
  • 打赏
  • 举报
回复
既然用ATL,建议你看看MSDN里关于Implement Interface ATL wizard可能可以解决你的问题
congcongguoke 2001-06-27
  • 打赏
  • 举报
回复
CoCreateInstance(CLSID_FooX,NULL,CLSCTX_INPROC_SERVER,
~~~~~~~~~~
IID_IFooX,(void **) &pFooX);可以得到pFoo1,pFoo2,pFoo3指针。
我觉得QueryInterface处理的同一个CLSID下的东西,而你的三个指针指在三个不同的CLSID中,所以没成功。
HWLee 2001-06-27
  • 打赏
  • 举报
回复
谢谢各位!
to horris(僧推月下门):
那么怎样才能得到pFoo2以及pFoo3呢。
方法一、改写class CA:public IFoo1,public IFoo2,public IFoo3
方法二、调用CoCreateInstance。CoCreateInstance是不是应该替换为CoGetClassObject及
CreateInstance更好一些。

to flywhc(午夜蓝调):
>用Atl simple object 向导生成的。
>import可以用,我不想include "...test_i.c

horris 2001-06-27
  • 打赏
  • 举报
回复
to HWLee(思我所思,爱我所爱):
_com_ptr_t<>::= 内部调QueryInterface
horris 2001-06-27
  • 打赏
  • 举报
回复
to flywhc(午夜蓝调):
同一个对象继承多个接口,不管QueryInterface什么接口都返回this
>这是错误的,一定要进行类型转换,最好用static_cast<>
我觉得一般支持IDispatch的才可以。
>import不限于IDispatch
to HWLee(思我所思,爱我所爱):
_com_ptr_t<>::= 内部加AddRef
flywhc 2001-06-27
  • 打赏
  • 举报
回复
#import 导入类型库。

我觉得一般支持IDispatch的才可以。
因为它会自动生成纯虚类的 IFoo1, IFoo2...,以及_com_ptr_t的 IFoo1Ptr...
这样,可以用 .QueryInterface .CreateInstance等COM方法,

也可以用 ->操作IFoo1里的接口方法。
它自动 AddRef/Release,因此不用担心担心那些崩溃、内存泄漏的问题。
flywhc 2001-06-27
  • 打赏
  • 举报
回复
问题写的太简单,谁知道你用什么方法写的三个借口,是否自己写QueryInterface了?

如果自己写的,同一个对象继承多个接口,不管QueryInterface什么接口都返回this,然后AddRef, 不是很简单? :P

既然的到pUnknown,用pUnknown是否可以QueryInterface其他的接口?
horris 2001-06-27
  • 打赏
  • 举报
回复
注意是p1.QueryInterface(IID_Foo2,&p2);而不是->
horris 2001-06-27
  • 打赏
  • 举报
回复
问题:如果class CA: public IFoo1,public IFoo2,而没有继承IFoo3。会不会通过IFoo1
QueryInterface不到IFoo3。
>是的。
另外,#import "..\..\test.dll" no_namespace named_guids import 了什么?:-(我很菜的:-(
>生成了三个_com_ptr_t(这是个模板类)的派生类:IFoo1Ptr,IFoo1Ptr,IFoo1Ptr,这样的话,你可以写如下语句:
IFoo1Ptr p1;
p1.CreateInstance(...);
p2=p1;//or: p1.QueryInterface(IID_Foo2,&p2);
p3=p1;
xyjiao 2001-06-27
  • 打赏
  • 举报
回复
把idl文件贴出来看看?
nerk 2001-06-27
  • 打赏
  • 举报
回复
我也认为你另外两个接口和IFoo1在不同的类里。
加载更多回复(2)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧