哪位看过此书的高手请指点我一下,根据书上讲的,在外部对象的Init()函数中,创建内部对象时会传递一个IUnkown的接口,根据他的代码返回值应该是非委托的IUnkown的接口指针。而这个非委托的IUnkown的接口没有QueryInterface()而只有NondelegationQueryInterface()。即使调用委托IUnkown接口的QueryInterface(),也只能返回外部函数的IUnkown指针的函数。
    总之,我觉得外部对象的QueryInterface()中对内部对象接口的查询该用NondelegationQueryInterface()。
    语无伦次,请见谅。

解决方案 »

  1.   

    去看《COM本质论》吧。那里会有详细的说明。
      

  2.   

    请注意:
    INondelegationUnknown和IUnknown是相同定义的
    并且是用同一个IID
    因为COM不是通过类名来识别接口,而是通过vtable来调用接口成员函数
    可以看出INondelegationUnknown和IUnknown的vtable是一样的
    所以pUnknownInner只需要定义为IUnknown*就行了
    当然如果你将pUnknownInner定义为INondelegationUnknown*也可以
    这样的话,就会像你所说的必须用NondelegationQueryInterface而不是QueryInterface()
    这样有失一般性,
    另外INondelegationUnknown和IUnknown对编译器来说不会引起向上类型转换的混乱,如果用嵌套类的方法实现委托和非委托IUnknown接口的话就不必用不同名字来区别。