COM中,通过pIUnknown->QueryInterface(const IID& iid, void** ppv)来查询,但第一个参数不理解,他不是类ID,是接口ID,但这个const IID& iid是个什么值,是默认的吗?不是默认的如何获取?

解决方案 »

  1.   

    就是com组件每一个都有一个id,类似名字的概念,你通过这个名字来查找,从而通过ppv把它的接口返回给你
      

  2.   

    // Generated .IDL file (by the OLE/COM Object Viewer)
    // 
    // typelib filename: XCDZIP35.OCX[
      uuid(B26F6243-4C7D-11D1-910E-00600807163F),
      version(2.78),
      helpstring("Xceed Zip ActiveX Control")
    ]
    library XCEEDZIPLib
    {
        // TLib :     // TLib : Standard OLE Types : {BEF6E001-A874-101A-8BBA-00AA00300CAB}
        importlib("olepro32.dll");
        // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
        importlib("stdole32.tlb");    // Forward declare all types defined in this typelib
        dispinterface _DXceedZip;
        dispinterface _DXceedZipEvents;    [
          uuid(B26F6244-4C7D-11D1-910E-00600807163F),
          helpstring("Dispatch interface for the Xceed Zip Control"),
          hidden
        ]
        dispinterface _DXceedZip {
            properties:
                [id(0x00000001)]
                VARIANT_BOOL Abort;
                [id(0x00000002)]
                short Compression;
      
                 ..........
                [id(0xfffffdd8)]
                void AboutBox();
        };    [
          uuid(B26F6245-4C7D-11D1-910E-00600807163F),
          helpstring("Event interface for the Xceed Zip Control")
        ]
        dispinterface _DXceedZipEvents {
            properties:
            methods:
                [id(0x00000001)]
                void Adding(
                                BSTR* FileName, 
                                long Size, 
                                long PSize, 
                                long Processed, 
                                short FileAttr, 
                                BSTR* FTime, 
                                long CRC, 
                                short Ratio, 
                                short Completion, 
                                short Method, 
                                short Encrypted, 
                                short ComLen, 
                                BSTR* Comment);
                [id(0x00000002)]
                void Deleting(BSTR* FileName);
                [id(0x00000003)]
                void Extracting(
                                BSTR* FileName, 
                                long Size, 
                                long PSize, 
                                long Processed, 
                                short FileAttr, 
                                BSTR* FTime, 
                                long CRC, 
                                short Ratio, 
                                short Completion, 
                                short Method, 
                                short Encrypted, 
                                short ComLen, 
                                BSTR* Comment);
                [id(0x00000004)]
                void FileComment(
                                BSTR* FileName, 
                                short* ComLen, 
                                BSTR* Comment);
                [id(0x00000005)]
                void Fixing(BSTR* FileName);
                [id(0x00000006)]
                void Listing(
                                BSTR* FileName, 
                                long Size, 
                                long PSize, 
                                long Processed, 
                                short FileAttr, 
                                BSTR* FTime, 
                                long CRC, 
                                short Ratio, 
                                short Completion, 
                                short Method, 
                                short Encrypted, 
                                short ComLen, 
                                BSTR* Comment);
                
    ........................
                [id(0x0000000f)]
                void Rename(
                                BSTR* OrigName, 
                                BSTR* NewName);
        };    [
          uuid(B26F6246-4C7D-11D1-910E-00600807163F),
          helpstring("Xceed Zip Control"),
          control
        ]
        coclass XceedZip {
            [default] dispinterface _DXceedZip;
            [default, source] dispinterface _DXceedZipEvents;
        };
    };是不是UUID这些呢
      

  3.   

    帮我看个简单的OCX加载问题,谢谢了
    const GUID   MyOcxCLSID = {0xB26F6246,0x4C7D,0x11D1,0x91,0x0E,0x00,0x60,0x08,0x07,0x16,0x3F};  //我的OCX,CLSID
    if (CoInitialize(NULL) != S_OK) {
    printf("Initialize COM library failed!\n");
    return 1L;
    } hResult = CoCreateInstance(MyOcxCLSID, NULL,CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnknown);
    if (hResult != S_OK) 
    {
    printf("Create object failed!\n");
    return 1L;
    }//返回了IID_IUnknown是{00020430-0000-0000-C000-000000000046} //这个IID好象不是我要的
    象是系统OLE hResult = pUnknown->QueryInterface(IID_IUnknown, (void **)&ppIface);
    if (hResult != S_OK) {
    pUnknown->Release();
    printf("QueryInterface IDictionary failed!\n");
    CoUninitialize();
    return 1L;
    }//返回的ppIface,通过**查询,也到不了我的OCX那里,我查了我的OCX是加载到10001000上面,而这个指针指向的地址在5FXXXXXX那,不是我的OCX代码
    if (pUnknown->Release()!= 0) 
    CoUninitialize(); return 1L;
      

  4.   

    com 本质论系统学习一下。
      

  5.   

    LS正解,搞本书看看。
    这个id叫接口ID,说白了,你想要这个COM组件的什么功能,就传递什么接口ID就可以了。
      

  6.   

    一个对象可以有多个接口,CLS_ID是对象的ID,IID是接口的ID
      

  7.   

    就是一个UUID ,一般你需要把它所在定义的.h文件包起来,不包也行,反正UUID不会变,你复制到你的.h文件 里面直接用,也可以的。
      

  8.   

    一个组件具体实现了哪些接口,作者会在文档里说。没有文档只有一个IUnknown你什么都干不了。