在BHO中...使用一个类CDD实现了IDocHostUIHandle, IE使用此BHO时出现JS方面的错误...初步判断是GetExternal()方法重载时出现错误, 我只是简单的返回E_NOTIMPL...不知各位有何建议...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)

解决方案 »

  1.   

    GetExternal(IDispatch** ppDispatch)
    {
      *ppDispatch = NULL;
      return E_NOTIMPL;
    }
      

  2.   

    那你别返回NOTIMPL,返回S_FALSE得了
      

  3.   

    是不是不应该简单的置为NULL然后返回一值... 应该在BHO中得到IDispatch的指针然后传给*ppDispatch吧...?
      

  4.   

    本来应该是这样,但你没有提供external的话就只能置NULL了
      

  5.   

    1. 没有提供external...? 我在BHO中怎么提供呢...
    2. 设置为NULL...出现错误提示
      

  6.   

    http://msdn.microsoft.com/en-us/library/aa753256(VS.85).aspx
    如果你需要设自己的external,返回S_OK。否则返回S_FALSE。如果需要报告错误,返回一个错误代码(比如E_ACCESSDENIED)
      

  7.   


    我需要的是用IE原来默认的IDispatch...但不知在BHO中怎么得到...我现在是在DownloadComplete()中 HRESULT hr;
    CComPtr<IDispatch> spDisp;   hr = m_spWebBrowser->get_Document(&spDisp);  
    if ( SUCCEEDED(hr) )
    {
    CComQIPtr<IHTMLDocument2> spHtmlDoc(spDisp); 
    if (spHtmlDoc) 

    CComPtr<IHTMLWindow2> spWindow; 
    spHtmlDoc->get_parentWindow(&spWindow); 
    if (spWindow) 

    spWindow->get_external(&m_spExtDisp); 

    }
    }
    在GetExternal()中
     *ppDispatch = m_spExtDisp; 
      return S_OK; 
    不知思路是否正确
      

  8.   

    得不到,不过你可以创建shell ui helper对象
      

  9.   


    没有别的方法了吗...? 
    我现在只是在BHO中实现鼠标的托动...至于动那么大干戈吗...?
      

  10.   


    我按你的思路去试了一下,是可以的。就是把原IHTMLWindows的external传给ppDispatch就可以了。