难点每次都要给QueryInterface传递一个ID来进行测试是否支持

解决方案 »

  1.   

    IDispatch 接口...其目的就是能够让你不知道对方是什么接口, 而只需要知道对方有些什么函数或者属性就可以通过这个接口进行调用或者读写...你为何要这样做呢....
    明知道它就是一个什么类型的接口, 你也可以直接查询变换就是了. 
    虽然不知道你到底为了什么要去查接口的底细, 但是IDispatch接口创造出来的目的, 不是为了让你查底细...
      

  2.   

    是的,QueryInterface里面的实现只是一些if语句根据你传递过来的ID判断的
      

  3.   

    我能看到QueryInterface具体怎么实现的吗?
      

  4.   

    你转到定义看看,有的能有的不能,不过一些讲COM的书里一般都会讲到的
      

  5.   

    哦!原来不可以查询QueryInterface具体怎么实现的?
      

  6.   

    例如:http://hi.baidu.com/starloooooove/blog/item/728681007b247d8ce850cdc6.html
    网上随便找个例子看下就知道的HRESULT __stdcall CCOM_OBJECT::QueryInterface(const IID &iid, void **iface)
    {// requesting the IUnknown base interface
    if (iid==IID_IUnknown)
    {
    cout << "Requesting IUnknown interface" << endl;
    *iface = (IX*)this;} // end if// maybe IX?
    if (iid==IID_IX)
    {
    cout << "Requesting IX interface" << endl;
    *iface = (IX*)this;} // end if
    else // maybe IY
    if (iid==IID_IY)
    {
    cout << "Requesting IY interface" << endl;
    *iface = (IY*)this;} // end if
    else
    { // cant find it!
    cout << "Requesting unknown interaface!" << endl;
    *iface = NULL;
    return(E_NOINTERFACE);
    } // end else// if everything went well cast pointer to IUnknown and call addref()
    ((IUnknown *)(*iface))->AddRef();return(S_OK);} // end QueryInterface
      

  7.   

    如果你只有一个IDispatch接口指针,那你只能通过QueryInterface一个一个测试了。但如果你的调用的IDispatch对象的实现COM库支持TypeLib库,你可以通过ITypeLib获取支持的对象/接口等信息