本帖最后由 winvxd 于 2012-10-18 06:12:13 编辑

解决方案 »

  1.   

    IDispatch->IWebBrowser->IWebBrowserApp->IWebBrowser2
    接口的继承关系是这样的
      

  2.   

    这可能是wizard的bug,IDispatchImpl每个类只有继承一次,多了即使编译成功,后面IWebBrowser2的IDispatch接口也被无视
    class ATL_NO_VTABLE CSimpler :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CSimpler, &CLSID_Simpler>,
    public IConnectionPointContainerImpl<CSimpler>,
    public CProxy_ISimplerEvents<CSimpler>,
    public ISimpler,
    public IDispatchImpl<IWebBrowser, &__uuidof(IWebBrowser), &LIBID_SHDocVw, /* wMajor = */ 1, /* wMinor = */ 1>,
    public IWebBrowser2,
    public IWebBrowserApp
    {
    public:
    CSimpler()
    {
    }DECLARE_REGISTRY_RESOURCEID(IDR_SIMPLER)
    BEGIN_COM_MAP(CSimpler)
    COM_INTERFACE_ENTRY(ISimpler)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(IWebBrowser)
    COM_INTERFACE_ENTRY(IConnectionPointContainer)
    COM_INTERFACE_ENTRY(IWebBrowser)
    COM_INTERFACE_ENTRY(IWebBrowser2)
    COM_INTERFACE_ENTRY(IWebBrowserApp)
    END_COM_MAP()BEGIN_CONNECTION_POINT_MAP(CSimpler)
    CONNECTION_POINT_ENTRY(__uuidof(_ISimplerEvents))
    END_CONNECTION_POINT_MAP()
    DECLARE_PROTECT_FINAL_CONSTRUCT()HRESULT FinalConstruct()
    {
    return S_OK;
    }void FinalRelease()
    {
    }
     
    }
      

  3.   

    上面去掉一行COM_INTERFACE_ENTRY(IWebBrowser)
      

  4.   

    看错了,因为IWebBrowser有继承,修改如下:class ATL_NO_VTABLE CSimpler :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CSimpler, &CLSID_Simpler>,
    public IConnectionPointContainerImpl<CSimpler>,
    public CProxy_ISimplerEvents<CSimpler>,
    public ISimpler,
    public IDispatchImpl<IWebBrowser2, &__uuidof(IWebBrowser), &LIBID_SHDocVw, /* wMajor = */ 1, /* wMinor = */ 1>
    {
    public:
    CSimpler()
    {
    }DECLARE_REGISTRY_RESOURCEID(IDR_SIMPLER)
    BEGIN_COM_MAP(CSimpler)
    COM_INTERFACE_ENTRY(ISimpler)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(IConnectionPointContainer)
    COM_INTERFACE_ENTRY(IWebBrowser)
    COM_INTERFACE_ENTRY(IWebBrowser2)
    COM_INTERFACE_ENTRY(IWebBrowserApp)
    END_COM_MAP()BEGIN_CONNECTION_POINT_MAP(CSimpler)
    CONNECTION_POINT_ENTRY(__uuidof(_ISimplerEvents))
    END_CONNECTION_POINT_MAP()
    DECLARE_PROTECT_FINAL_CONSTRUCT()HRESULT FinalConstruct()
    {
    return S_OK;
    }void FinalRelease()
    {
    }
     
    }
      

  5.   

    这个是正解。呵呵。
    用wizard实现接口后要去掉这个2个多余的,另外,需要手工把BOOL修改成VARIANT_BOOL
    希望此贴对大家有用。