谢谢各位帮忙看看我学习中的几个问题,1.判断调用是否成功的define宏
#define SUCCEEDED(Status)((HRESULT)(Status)>=0)
(HRESULT)(Status)该怎么理解,是不是Status有可能不是HRESULT类型,要转换一下?2.DEFINE_GUID中为什么会有那么多都好隔开?还有前面有0x的前缀,这个跟16进制是什么关系?DEFINE_GUID(CLSID_Math,
0x9509f982,0x6991,0x40c4,0xb3,0xdf,0xa,0x8,0xc9,0xef,0xf5,0x20,0x05
)3.QueryInterface中返回IUnknown接口时的情况。
HRESULT Math::QueryInterface(REFIID riid, viod** ppv){
 *ppv=0;
 if(riid==IID_IUnknown)
   *ppv=(IMath*)this;  //这里为什么是转换成一个IMath接口的指针?
 else if(riid==IID_IMath)
   *ppv=(IMath*)this;
 else if(riid==IID_IAdvanceMath)
   *ppv=(IAdvancedMath*)this;
 if(*ppv)
 {
  (Iunknown *)(*ppv)->AddRef();//这里把这个指针转换成IUnkown上面去了?
   Return(S_OK);
  }
return(E_NOINTERFACE);
 
}
非常感谢

解决方案 »

  1.   

    1.typedef LONG HRESULT;SUCCEEDED传入的参数可能不是LONG,进行下强制转换,比如INT2.DEFINE_GUID是定义一个GUID,并且初始化这个GUID结构;0x表示是一个16进制数。3.一个对象可能继承于多个接口,每个接口都继承于IUnknown,所以QueryInterface要指明IUnkown具体由那个接口实现的;因为多个接口引用数由IUnkown来实现。
      

  2.   

    谢谢回复。第二个问题,为什么会有那么多逗号隔开?这个结构的定义有没有什么原因?GENGUID生成的UUID本身不是这个结构,这个和16进制有什么关系?第三个问题,组建继承于IMath接口,IMath接口继承于IUnknown接口,IMath接口本身不会实现IUnknown接口,对吗?应该是由组件来实现IUnknown接口的成员函数,而这个实现是间接通过实现IMath来的,对不对?所以这里IUnkown接口的指针实际上也是IMath接口的指针,是不是这样理解?可是组件本身也要继承IUnkown接口吧?可是,如果访问的接口是IAdvancedMath,为了实现引用计数,需要先转换到IUnkown接口,(Iunknown *)(*ppv)->AddRef();是不是影响了返回值?有点晕,转不过来。谢谢
      

  3.   

    #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
            EXTERN_C const GUID DECLSPEC_SELECTANY name \
                    = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }typedef struct _GUID {
        unsigned long  Data1;
        unsigned short Data2;
        unsigned short Data3;
        unsigned char  Data4[ 8 ];
    } GUID;
    http://www.codeproject.com/script/Articles/MemberArticles.aspx?amid=5890
      

  4.   

    GUID
    Globally Unique Identifier(全球唯一标识符)
    为什么要使用 GUID ?
      世界上的任何两台计算机都不会生成重复的 GUID 值。GUID 主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的标识符。在 Windows 平台上,GUID 应用非常广泛:注册表、类及接口标识、数据库、甚至自动生成的机器名、目录名等。 
    http://baike.baidu.com/view/185358.htm?fr=ala0_1
      

  5.   

    SUCCEEDED是返回一个HRESULT类型,而status>=0是一个BOOL行的,所以他要强制转换.
    DEFINE_GUID是全球唯一ID,它是用十六进制保存的.至于为什么用逗号隔开,那你去看他的定义就明白了.if(riid==IID_IUnknown)
       *ppv=(IMath*)this;  //这里为什么是转换成一个IMath接口的指针?
    当传递一个IID_IUnKonw时,你提供的默认接口,这跟可根据情况改. (Iunknown *)(*ppv)->AddRef();//这里把这个指针转换成IUnkown上面去了?
    这个是调用接口的引用计数.(每个接口都是从Iunknown 继承,Iunknown 实现了AddRef
      

  6.   

    第三个问题,组建继承于IMath接口,IMath接口继承于IUnknown接口,IMath接口本身不会实现IUnknown接口,对吗?应该是由组件来实现IUnknown接口的成员函数,而这个实现是间接通过实现IMath来的,对不对?所以这里IUnkown接口的指针实际上也是IMath接口的指针,是不是这样理解?可是组件本身也要继承IUnkown接口吧? 可是,如果访问的接口是IAdvancedMath,为了实现引用计数,需要先转换到IUnkown接口,(Iunknown *)(*ppv)->AddRef();是不是影响了返回值? 有点晕,转不过来。 谢谢