RT

解决方案 »

  1.   

    1。 activcx 实现 IOleInPlaceSite IOleClientSite 接口
    2。HRESULT CNXPWebCtrl::FinalConstruct()
    {
    CComVariant varEmpty;

    m_pWebBrowser = NULL;
    CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_INPROC, IID_IWebBrowser2,
    (void**)&m_pWebBrowser);

    return S_OK;
    }3。LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {

    MSG  Msg;
    RECT  rcClient;
    IOleObject* pOleObject;
    IUnknown* pUnk;
    HRESULT hResult;

    pOleObject = NULL;
    m_pWebBrowser->QueryInterface(IID_IOleObject, (void**)&pOleObject);
    ATLASSERT(pOleObject);

    hResult = pOleObject->SetClientSite(this);
    ATLASSERT(SUCCEEDED(hResult));

    hResult = pOleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, &Msg, this, 0, m_hWnd, &rcClient);
    ATLASSERT(SUCCEEDED(hResult));

    pOleObject->Release();

    pUnk = NULL;
    m_pWebBrowser->QueryInterface(IID_IUnknown, (void**)&pUnk);
    hResult = AtlAdvise(pUnk, this->GetUnknown(), DIID_DWebBrowserEvents2, &m_dwCookie);
    ATLASSERT(SUCCEEDED(hResult));
    pUnk->Release();

    IOleInPlaceObject* pObject = NULL;
    m_pWebBrowser->QueryInterface(IID_IOleInPlaceObject,(void**)&pObject);
    ATLASSERT(pObject);

    hResult = pObject->SetObjectRects(&rcClient, &rcClient);
    ATLASSERT(SUCCEEDED(hResult));
    pObject->Release();
    CComVariant varEmpty; return m_pWebBrowser->Navigate(L"about:blank", &varEmpty, &varEmpty, &varEmpty, &varEmpty);
    }4。STDMETHODIMP CNXPWebCtrl::Invoke(
     DISPID DispIDMember,
     REFIID refid,
     LCID lcid,
     WORD wFlags,
     DISPPARAMS* pDispParams, 
     VARIANT* pVarResult,
     EXCEPINFO* e,
     UINT *ui)
    {
    // if (!pVarResult)
    // {
    // return E_POINTER;
    //}

    // PrintDISPID(DispIDMember);

    switch (DispIDMember) 
    {
    case DISPID_NEWWINDOW2:
    NewWindow2(pDispParams);
    break;
    case DISPID_PROGRESSCHANGE:
    OnProgressChange(pDispParams); 
    break;
    case DISPID_STATUSTEXTCHANGE:
    OnStatusTextChange(pDispParams); 
    break;
    case DISPID_DOCUMENTCOMPLETE:
    OnComplete(); 
    break;
    case DISPID_BEFORENAVIGATE2:
    BeforeNavigate2(pDispParams);
    ClearCookie();
    break;
    case DISPID_BEFORENAVIGATE:
    ClearCookie();
    break;
    case DISPID_ONQUIT:
    ClearCookie();
    break;
    case DISPID_HTMLELEMENTEVENTS_ONDBLCLICK:
    OnClicked(pVarResult);
    break;
    case DISPID_HTMLELEMENTEVENTS_ONCLICK:
    OnClicked(pVarResult);
    break;
    default:
    return IDispatchImpl<INXPWebCtrl,&IID_INXPWebCtrl,
    &LIBID_NXPWEBLib,1,0,
    ::ATL::CComTypeInfoHolder>::Invoke(DispIDMember,
     refid,
     lcid,
     wFlags,
     pDispParams, 
     pVarResult,
     e,
     ui);
    //return DISP_E_MEMBERNOTFOUND;
    }
    return S_OK;
    }5。void CNXPWebCtrl::OnComplete()
    {

    if (!m_pWebBrowser) 
    {
    return;
    }

    IHTMLDocument2 *pDocument = GetDocument();
    if (!pDocument)
    {
    return;
    }

    if (!m_dwCookie2) 
    {
    IUnknown* pUnk = NULL;
    pDocument->QueryInterface(IID_IUnknown, (void**)&pUnk);
    ATLASSERT(pUnk);
    AtlAdvise(pUnk, GetUnknown(), DIID_HTMLDocumentEvents, &m_dwCookie2);
    pUnk->Release();
    }

    pDocument->Release();
    }或者 留个 emial, 我发个我写的 给你
      

  2.   

    多谢了.查了一些资料.发现如果用Advise(...)方式截获DIID_HTMLDocumentEvents的方法有时候对一些IE版本没有用.我用了类似的方法在IE5.5+环境里可以.但在IE5.0一下就不行.麻烦发送你的代码到[email protected].我试一下是否可以在早的版本里面运行.有个方法就是获取IHTMLElement,然后调用IHTMLElement::put_onclick(...)方法可以保证对IE4.0+版本有效果.只是我试了没有成功.是否有什么别的建议?我有几千分可以送.要分不是问题.:D