用调试工具单步跟踪进 QueryInterface 看看,大半可以找到问题所在。

解决方案 »

  1.   

    to Elminster():
    怎么调试呀?怎么能够单步跟踪进QueryInterface?
      

  2.   

    问题:如果class CA: public IFoo1,public IFoo2,而没有继承IFoo3。会不会通过IFoo1 
    QueryInterface不到IFoo3。
    另外,#import "..\..\test.dll" no_namespace named_guids import 了什么?:-(我很菜的:-(
      

  3.   

    我是猜的可能性哈:
    其一是三个接口分属三个com对象,
    或者其二你的QueryInterface没有支持互查噻
    或者.....
      

  4.   

    我也认为你另外两个接口和IFoo1在不同的类里。
      

  5.   

    问题:如果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;
      

  6.   

    注意是p1.QueryInterface(IID_Foo2,&p2);而不是->
      

  7.   

    问题写的太简单,谁知道你用什么方法写的三个借口,是否自己写QueryInterface了?如果自己写的,同一个对象继承多个接口,不管QueryInterface什么接口都返回this,然后AddRef, 不是很简单? :P既然的到pUnknown,用pUnknown是否可以QueryInterface其他的接口?
      

  8.   

    #import 导入类型库。我觉得一般支持IDispatch的才可以。
    因为它会自动生成纯虚类的 IFoo1, IFoo2...,以及_com_ptr_t的 IFoo1Ptr...
    这样,可以用 .QueryInterface .CreateInstance等COM方法,也可以用 ->操作IFoo1里的接口方法。
    它自动 AddRef/Release,因此不用担心担心那些崩溃、内存泄漏的问题。
      

  9.   

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

  10.   

    to HWLee(思我所思,爱我所爱):
    _com_ptr_t<>::= 内部调QueryInterface
      

  11.   

    谢谢各位!
    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
      

  12.   

    CoCreateInstance(CLSID_FooX,NULL,CLSCTX_INPROC_SERVER,
                     ~~~~~~~~~~
    IID_IFooX,(void **) &pFooX);可以得到pFoo1,pFoo2,pFoo3指针。
    我觉得QueryInterface处理的同一个CLSID下的东西,而你的三个指针指在三个不同的CLSID中,所以没成功。
      

  13.   

    既然用ATL,建议你看看MSDN里关于Implement Interface ATL wizard可能可以解决你的问题
      

  14.   

    其实你只要在IFoo1组件中聚合IFoo2,IFoo3组件接口就可以实现你上面的代码。《ATL开发指南》2/e的聚合部分。
      

  15.   

    这是我的茁见,不知道你有没有在你的IFoo1中使用聚合???????
      

  16.   

    HRESULT hr = pFoo1->QueryInterface(IID_IFoo2,(void **) &pFoo2);
    如果用ATL做的,pFoo1的指向的对象根本没有接口IFoo2,IFoo3。所以返回的结果会是NOINTERFACE吧,如果你Query,IDispatch的接口的话会有的,一般都继承啦IDispatch的。
    至于CoCreateInstance这个函数中你提供啦IID_IFoo2啦,他会创建一个IID_IFoo2的对象,然后得到指针。事实上就是不能得到的。除非你的对象一次继承这三个接口。其实看看用SDK写的COM,我想一下就明白啦不好意思,冒昧啦
      

  17.   

    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类,可以直接向我上面