如下代码
HXCreateInstance(IUNknown** ppExFileFormatObj)
{
   **ppExFileFormatObj=(IUnknown*)(IHXPlugin*)new CMyExampleFileFormat();什么意思
(IUnknown*)(IHXPlugin*)什么含义呢小弟对指针实在不熟,看着就晕

解决方案 »

  1.   

    指针就是一个东西的地址嘛,new出来的对象是一个指针,所以要把它转化成(IHXPlugin*)再转化成IUnknown型的指针赋给ppExFileFormatObj指向的地址,为了把new出来的东西从参数传回去,所以把ppExFileFormatObj定义成指针的指针
      

  2.   

    (IUnknown*)(IHXPlugin*)就是把new出来的东西强制转换成IUnknown*的形式以便传出参数,这个函数的用法大概是这样的
    IUNknown* p=NULL;
    HXCreateInstance(&p);
    这样的话p就被构造了一个CMyExampleFileFormat类型的对象的指针,用完之后,记得释放,就好了
    delete p;
    p=NULL;
      

  3.   

    还是不懂,(IUnknown*)(IHXPlugin*)转换结果到底是什么类型,是IUnknown的话为什么还要IHXPlugin*做什么
      

  4.   

    必须先IUnknown的派生类指针转换,再转成IUnknown*
    因为这涉及对象的内存布局。你的对象是多重继承,其布局类似如下:
    IUnknown的部分
    IHXPlugin的部分
    你的非静态成员变量
    你的类的vptr因为IUnknown和IHXPlugin都没有成员变量,因此只有一个data member,虚函数表指针(vptr)。(有些编译器可能不止会再多一个字节,详情请参考对象模型的资料)
    而new 返回的指针指向第一个位置,即IUnknown的部分,因此在这可以直接取得。但当你的对象实现了多个接口,如IA和IB(IA和IB都从IUnknown派生),则布局如下:
    IUnknown的部分
    IA的部分
    IUnknown的部分
    IB的部分
    你的非静态成员变量
    你的类的vptr因此又可以说可以直接取得IUnknown*,但有些编译器可能将你的“你的类的vptr”放在前面,这样如果直接取将会得到指向你的类的vptr的指针,当调用时将会出现错误(如调用IUnknown::AddRef,其取得的函数地址已不再是IUnknown::AddRef,错误)。之所以要先(IHXPlugin*)就是要先使其指向正确的地方,对于上例,(IB*)后指针已指向第二个“IUnknown的部分”(因为IB其实包含第二个“IUnknown的部分”和“IB的部分”)。此时也必须调用(IUnknown*),它有可能将IB的vptr放在第二个“IUnknown的部分”之前,如果直接取就又错误了
      

  5.   

    要把new CMyExampleFileFormat()转化成(IHXPlugin*)再转化成IUnknown型的指针赋给ppExFileFormatObj指向的地址。指针就是指向某个数据的地址,没有什么神秘之处!
      

  6.   

    ??
    应该是
    *ppExFileFormatObj=(IUnknown*)(IHXPlugin*)new CMyExampleFileFormat();
      

  7.   

    你知道,所有的接口都是从IUnknown派生的,CMyExampleFileFormat可能是多冲继承的,比如说CMyExampleFileFormat继承自IHXPlugin和IHXPlugin11,那么如果你直接写**ppExFileFormatObj=(IUnknown*)new CMyExampleFileFormat();的话,那么ppExFileFormatObj的这个IUnknown到底是从IHXPlugin继承而来还是从IHXPlugin11继承而来的IUnknown呢?这样子容易产生歧义,所以要显示地说明ppExFileFormatObj到底是从那继承而来的
      

  8.   

    应该是
    *ppExFileFormatObj=(IUnknown*)(IHXPlugin*)new CMyExampleFileFormat();
    不说还没看出来:(
      

  9.   

    **ppExFileFormatObj=(IUnknown*)(IHXPlugin*)new CMyExampleFileFormat();
    使用(IUnknown*)(IHXPlugin*)的原因是,new CMyExampleFileFormat()返回的指针不能直接强制转换成IUnknown*,因此需要一个中间指针类型转换,这就是IHXPlugin*。这是CPP强类型的特点,如果在C中(事实C中根本就没有类,但有类似的情况),不要强制类型转换也能通过。类似的例子:CString转换成LPTSTR是失败的:
    LPTSTR lptstr;
    CString str;
    lptstr=(LPTSTR)str;//将报告错误但使用中间类型后就OK了:
    lptstr=(LPTSTR)(LPCTSTR)str;//本语句OK