LPVOID FAR* ppIface=NULL;
const GUID MyOcxCLSID = {0xB26F6246,0x4C7D,0x11D1,0x91,0x0E,0x00,0x60,0x08,0x07,0x16,0x3F };  //My CLSID:XCDZIP35.OCX
const IID MyOcxFaceID =  {0xB26F6244,0x4C7D,0x11D1,0x91,0x0E,0x00,0x60,0x08,0x07,0x16,0x3F }; 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;
} hResult = pUnknown->QueryInterface(IID_IUnknown, (void **)&ppIface); if (hResult != S_OK) {
pUnknown->Release();
printf("QueryInterface IDictionary failed!\n");
return 1L;
}上面的IID_IUnknown指向的不是我的OCX的对象,是系统OLEXXX的,导致我后面ppIface获取的不是我的OCX接口指针,我用MyOcxFaceID代替也没用,我用OLE-VIEW查了一下我的OCX,// 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(0x00000026)]
            VARIANT_BOOL SfxInstallMode;
            [id(0x00000027), hidden]
            BSTR InternalState;
        methods:
            [id(0x00000028), propget]
            BSTR SfxPrompts(short SfxPromptID);
            [id(0x00000028), propput]
            void SfxPrompts(
                            short SfxPromptID, 
                            BSTR rhs);
              ………………
            [id(0x0000003b)]
            void SfxResetDefaultStrings();
            [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);
             ………………
    };    [
      uuid(B26F6246-4C7D-11D1-910E-00600807163F),
      helpstring("Xceed Zip Control"),
      control
    ]
    coclass XceedZip {
        [default] dispinterface _DXceedZip;
        [default, source] dispinterface _DXceedZipEvents;
    };
};请问一下,这到底怎么回到,我想获取我的OCX的虚拟表

解决方案 »

  1.   

    看看注册表里对应CLSID下面的类厂信息是不是正确
      

  2.   

    使用#import,然后使用智能指针
      

  3.   

    TypeLib:{B26F6243-4C7D-11D1-910E-00600807163F}
    ProgID:XCEEDZIP.XceedZipCtrl.1
    这些应该没错
    类ID是肯定没错的
    路径也正确 C:\Windows\SysWow64\XCDZIP35.OCX
    试过,好像也一样
      

  4.   

    为什么两处都是 MyOcxFaceID,不知道你 QueryInterface 的意义何在。
    hResult = CoCreateInstance(MyOcxCLSID, NULL,CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnknown);
    hResult = pUnknown->QueryInterface(IID_IUnknown, (void **)&ppIface);
      

  5.   

    为什么两处都不是 MyOcxFaceID
      

  6.   


    下面这句是调用之后返回的IID
    hResult = CoCreateInstance(MyOcxCLSID, NULL,CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnknown);下面这句是利用返回的IID来查询
    hResult = pUnknown->QueryInterface(IID_IUnknown, (void **)&ppIface);
    请问这错在哪呢
      

  7.   

    hResult = pUnknown->QueryInterface(IID_IUnknown, (void **)&ppIface);
    这样查出来难道 ppIface 和 pUnknown 的值不应该时一样的吗?你不是因该查询你自己的接口指针吗:
    hResult = pUnknown->QueryInterface(MyOcxFaceID, (void **)&ppIface);ppIface 的声明也有问题:
    LPVOID FAR *ppIface = NULL;
    1. 不应该是接口的指针,怎么是 LPVOID 指针呢?不过也不是不行,后面可以强转。
    2. 怎么是二级指针,&ppIface 岂不是三级指针了。还是没关系,同样可以强转。
      

  8.   

    因为我不知道这个OCX的接口,只知道CLSID,试了上面uuid都不行,想通知这个
    hResult = CoCreateInstance(MyOcxCLSID, NULL,CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnknown);
    来获取