请edyang,vcmfc,iamafraid,horris,EGE等大虾(呵呵,排名不分先后)来看看 QueryInterface的问题 用调试工具单步跟踪进 QueryInterface 看看,大半可以找到问题所在。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 to Elminster():怎么调试呀?怎么能够单步跟踪进QueryInterface? 问题:如果class CA: public IFoo1,public IFoo2,而没有继承IFoo3。会不会通过IFoo1 QueryInterface不到IFoo3。另外,#import "..\..\test.dll" no_namespace named_guids import 了什么?:-(我很菜的:-( 我是猜的可能性哈:其一是三个接口分属三个com对象,或者其二你的QueryInterface没有支持互查噻或者..... 我也认为你另外两个接口和IFoo1在不同的类里。 问题:如果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; 注意是p1.QueryInterface(IID_Foo2,&p2);而不是-> 问题写的太简单,谁知道你用什么方法写的三个借口,是否自己写QueryInterface了?如果自己写的,同一个对象继承多个接口,不管QueryInterface什么接口都返回this,然后AddRef, 不是很简单? :P既然的到pUnknown,用pUnknown是否可以QueryInterface其他的接口? #import 导入类型库。我觉得一般支持IDispatch的才可以。因为它会自动生成纯虚类的 IFoo1, IFoo2...,以及_com_ptr_t的 IFoo1Ptr...这样,可以用 .QueryInterface .CreateInstance等COM方法,也可以用 ->操作IFoo1里的接口方法。它自动 AddRef/Release,因此不用担心担心那些崩溃、内存泄漏的问题。 to flywhc(午夜蓝调):同一个对象继承多个接口,不管QueryInterface什么接口都返回this>这是错误的,一定要进行类型转换,最好用static_cast<>我觉得一般支持IDispatch的才可以。>import不限于IDispatchto HWLee(思我所思,爱我所爱):_com_ptr_t<>::= 内部加AddRef to HWLee(思我所思,爱我所爱):_com_ptr_t<>::= 内部调QueryInterface 谢谢各位!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 CoCreateInstance(CLSID_FooX,NULL,CLSCTX_INPROC_SERVER, ~~~~~~~~~~IID_IFooX,(void **) &pFooX);可以得到pFoo1,pFoo2,pFoo3指针。我觉得QueryInterface处理的同一个CLSID下的东西,而你的三个指针指在三个不同的CLSID中,所以没成功。 既然用ATL,建议你看看MSDN里关于Implement Interface ATL wizard可能可以解决你的问题 其实你只要在IFoo1组件中聚合IFoo2,IFoo3组件接口就可以实现你上面的代码。《ATL开发指南》2/e的聚合部分。 这是我的茁见,不知道你有没有在你的IFoo1中使用聚合??????? HRESULT hr = pFoo1->QueryInterface(IID_IFoo2,(void **) &pFoo2);如果用ATL做的,pFoo1的指向的对象根本没有接口IFoo2,IFoo3。所以返回的结果会是NOINTERFACE吧,如果你Query,IDispatch的接口的话会有的,一般都继承啦IDispatch的。至于CoCreateInstance这个函数中你提供啦IID_IFoo2啦,他会创建一个IID_IFoo2的对象,然后得到指针。事实上就是不能得到的。除非你的对象一次继承这三个接口。其实看看用SDK写的COM,我想一下就明白啦不好意思,冒昧啦 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类,可以直接向我上面 我在ListCtrl中用SHGetFileInfo插入系统图标为什么关闭后第二次打开就没有图标了 有没人知道如何控制程序本身的音量大小 NewActiveXObject类型的插件如何获取? 一个简单的IOCP(IO完成端口)服务器/客户端类 我们在设置密码的时候,输入的都是小黑点,请问这种效果如何用VC实现??? 遇到拖工资的公司怎么办? 有关DirectX中的DirectSound组建的问题 歌词文字异形 编译问题,请大虾们看看哦!(谢谢)! 我已经学过C++,想学VC++请问哪本书入门比较好啊? 请高手帮帮我!!! MFC和C++思想那一个更重要
怎么调试呀?怎么能够单步跟踪进QueryInterface?
QueryInterface不到IFoo3。
另外,#import "..\..\test.dll" no_namespace named_guids import 了什么?:-(我很菜的:-(
其一是三个接口分属三个com对象,
或者其二你的QueryInterface没有支持互查噻
或者.....
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;
因为它会自动生成纯虚类的 IFoo1, IFoo2...,以及_com_ptr_t的 IFoo1Ptr...
这样,可以用 .QueryInterface .CreateInstance等COM方法,也可以用 ->操作IFoo1里的接口方法。
它自动 AddRef/Release,因此不用担心担心那些崩溃、内存泄漏的问题。
同一个对象继承多个接口,不管QueryInterface什么接口都返回this
>这是错误的,一定要进行类型转换,最好用static_cast<>
我觉得一般支持IDispatch的才可以。
>import不限于IDispatch
to HWLee(思我所思,爱我所爱):
_com_ptr_t<>::= 内部加AddRef
_com_ptr_t<>::= 内部调QueryInterface
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
~~~~~~~~~~
IID_IFooX,(void **) &pFooX);可以得到pFoo1,pFoo2,pFoo3指针。
我觉得QueryInterface处理的同一个CLSID下的东西,而你的三个指针指在三个不同的CLSID中,所以没成功。
如果用ATL做的,pFoo1的指向的对象根本没有接口IFoo2,IFoo3。所以返回的结果会是NOINTERFACE吧,如果你Query,IDispatch的接口的话会有的,一般都继承啦IDispatch的。
至于CoCreateInstance这个函数中你提供啦IID_IFoo2啦,他会创建一个IID_IFoo2的对象,然后得到指针。事实上就是不能得到的。除非你的对象一次继承这三个接口。其实看看用SDK写的COM,我想一下就明白啦不好意思,冒昧啦
那么怎样才能得到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类,可以直接向我上面