在BHO中实现了IDocHostUIHandler接口...
其中的方法GetExternal()出现了错误...
(情况1)
XXX::GetExternal(IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
{
return E_NOTIMPL; // IE8中...打开另外一个新的标签时提示"错误: 尚未实现"
}(情况2)
XXX::GetExternal(IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
{
return S_OK; // IE8中...打开另外一个新的标签时提示"错误: 'window.external' 为空或不是对象"
}(情况3)
XXX::GetExternal(IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
{
*ppDispatch = NULL;
return S_FALSE; // IE8中...打开另外一个新的标签时提示"错误: 'window.external' 为空或不是对象"
}(情况4)
XXX::GetExternal(IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
{
*ppDispatch = (IDispatch*)this;
return S_OK; // IE8中...打开另外一个新的标签时提示"错误: 意外地调用了方法或属性访问。"
}到底怎么实现呢...请指点(MSDN上在讲contextmenu时...好像用theapp.m_...在我的BHO中theapp代表什么呢...)

解决方案 »

  1.   

    theapp 就是当前实例的,AfxGetApp
      

  2.   


    http://support.microsoft.com/kb/272968/zh-cnSTDMETHODIMP CCustomControlSite::XDocHostUIHandler2::GetExternal( 
                /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
    {
            // Return the IDispatch that you have to extend the object model.
            IDispatch* pDisp = (IDispatch*)theApp.m_pDispOM;   // 在BHO中...这句怎么写呢..???
            pDisp->AddRef();
            *ppDispatch = pDisp;
            return S_OK;
    }
      

  3.   

    先看你的m_pDispOM 这个成员变量是谁的,然后就是获取它
      

  4.   

    在BHO中...把我整晕了...我也不知哪跟呢..
      

  5.   

    class ATL_NO_VTABLE CDD :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CDD, &CLSID_DD>,
    public IObjectWithSiteImpl<CDD>,
    public IDispatchImpl<IDD, &IID_IDD, &LIBID_DragDropLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
    public IDocHostUIHandler,{
    public:
    CDD()
    {
    }DECLARE_REGISTRY_RESOURCEID(IDR_DD)DECLARE_NOT_AGGREGATABLE(CDD)BEGIN_COM_MAP(CDD)
    COM_INTERFACE_ENTRY(IDD)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(IObjectWithSite)
    COM_INTERFACE_ENTRY(IDocHostUIHandler)END_COM_MAP()
    DECLARE_PROTECT_FINAL_CONSTRUCT() HRESULT FinalConstruct()
    {
    return S_OK;
    } void FinalRelease()
    {
    }public: // IDocHostUIHandler STDMETHOD(ShowContextMenu)(/* [in] */ DWORD dwID, 
    /* [in] */ POINT __RPC_FAR *ppt, 
    /* [in] */ IUnknown __RPC_FAR *pcmdtReserved, 
    /* [in] */ IDispatch __RPC_FAR *pdispReserved); 
    STDMETHOD(GetHostInfo)( 
    /* [out][in] */ DOCHOSTUIINFO __RPC_FAR *pInfo); 
    STDMETHOD(ShowUI)( 
    /* [in] */ DWORD dwID, 
    /* [in] */ IOleInPlaceActiveObject __RPC_FAR *pActiveObject, 
    /* [in] */ IOleCommandTarget __RPC_FAR *pCommandTarget, 
    /* [in] */ IOleInPlaceFrame __RPC_FAR *pFrame, 
    /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pDoc); 
    STDMETHOD(HideUI)(void); 
    STDMETHOD(UpdateUI)(void); 
    STDMETHOD(EnableModeless)(/* [in] */ BOOL fEnable); 
    STDMETHOD(OnDocWindowActivate)(/* [in] */ BOOL fEnable); 
    STDMETHOD(OnFrameWindowActivate)(/* [in] */ BOOL fEnable); 
    STDMETHOD(ResizeBorder)( 
    /* [in] */ LPCRECT prcBorder, 
    /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pUIWindow, 
    /* [in] */ BOOL fRameWindow); 
    STDMETHOD(TranslateAccelerator)( 
    /* [in] */ LPMSG lpMsg, 
    /* [in] */ const GUID __RPC_FAR *pguidCmdGroup, 
    /* [in] */ DWORD nCmdID); 
    STDMETHOD(GetOptionKeyPath)( 
    /* [out] */ LPOLESTR __RPC_FAR *pchKey, 
    /* [in] */ DWORD dw); 
    STDMETHOD(GetDropTarget)( 
    /* [in] */ IDropTarget __RPC_FAR *pDropTarget, 
    /* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget); 
    STDMETHOD(GetExternal)( 
    /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch); 
    STDMETHOD(TranslateUrl)( 
    /* [in] */ DWORD dwTranslate, 
    /* [in] */ OLECHAR __RPC_FAR *pchURLIn, 
    /* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut); 
    STDMETHOD(FilterDataObject)( 
    /* [in] */ IDataObject __RPC_FAR *pDO, 
    /* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet); IDispatch *pDisp;
    };OBJECT_ENTRY_AUTO(__uuidof(DD), CDD)
      

  6.   

    XXX::GetExternal(IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
    {
            AddRef();
            *ppDispatch = (IDispatch*)this;
            return S_OK;    // IE8中...打开另外一个新的标签时提示"错误: 意外地调用了方法或属性访问。"
    }这样实现应该就可以了
      

  7.   

    实在没办法...就实现了IDispatch...唉...无语...
    http://www.eb163.com/club/thread-990-1-1.html
    先按这样整着吧...
    有啥好的提示说下啊...呵呵...明结贴...
      

  8.   


    哦,没注意看你的定义,确实要实现IDispatch接口,因为IE会调用IDispatch的方法。
      

  9.   

    asdfasdfasdfasdf
      

  10.   


    回傳一個物件時,UIHost 物件就被改寫,此時開新頁簽會失敗,原因是新頁簽預期的window.external.addTab(),這個方法addTab()你的物件並沒有實做,因此出現錯誤。這個問題基本上沒解。