首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >枚举BeforeNavigate2事件中的窗体

枚举BeforeNavigate2事件中的窗体
EN

Stack Overflow用户
提问于 2013-12-10 05:21:41
回答 1查看 573关注 0票数 0

我正在编写一个IE BHO,我想知道如何枚举事件回调中的表单。下面是在BeforeNavigate2事件中枚举表单的代码,但长度始终为0。

代码语言:javascript
复制
STDMETHODIMP CEventSink::Invoke(DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr)
{
    HRESULT hr;
    char bf[1024];

    if(!IsEqualIID(riid, IID_NULL)) 
        return DISP_E_UNKNOWNINTERFACE;

    if(dispIdMember == DISPID_BEFORENAVIGATE2) {

        IWebBrowser2* pSite = (IWebBrowser2*)pDispParams->rgvarg[6].pdispVal;

        IDispatch* pHtmlDocDispatch;
        hr = pSite->get_Document(&pHtmlDocDispatch);
        if (FAILED(hr) || !pHtmlDocDispatch) 
            return S_OK;

        IHTMLDocument2* pHtmlDoc = 0;

        hr = pHtmlDocDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc);

        if(SUCCEEDED(hr) && pHtmlDoc) {
            CComPtr<IHTMLElementCollection> pColl=NULL;
            hr = pHtmlDoc->get_forms(&pColl);

            if (SUCCEEDED (hr) && (pColl != NULL))
            {
                long nLength = 0;
                hr = pColl->get_length (&nLength);

                if(SUCCEEDED(hr)) {
                    sprintf(bf, "len = %d", nLength);
                    OutputDebugString(bf); // always 0
                }
            }
        }
    }
    return S_OK;
}

为什么总是输出0?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-11 11:21:15

我只是在我的BHO中复制/粘贴了你的代码,得到了一个非零长度的集合。

尝试那个URL:http://linuxfr.org/使用随机的用户/密码值并尝试连接。这将触发一个DISPID_BEFORENAVIGATE2,您将得到3个表单。

因此,您要导航的页面中似乎没有窗体。

此外,您的代码会泄漏内存,并且在使用COM接口(ag:您应该使用QueryInterfaceIDispatch获得IWebBrowser2 )方面是不完全正确的。

重写:

代码语言:javascript
复制
CComPtr<IDispatch> spIDispatch( pDispParams->rgvarg[6].pdispVal );
CComPtr<IWebBrowser2> spIWebBrowser2;
HRESULT hr = spIDispatch.QueryInterface<IWebBrowser2>( &spIWebBrowser2 );
if ( SUCCEEDED( hr ) && spIWebBrowser2 ) {
    CComPtr<IDispatch> spIDispatchDoc;
    hr = spIWebBrowser2->get_Document( &spIDispatchDoc );
    if ( SUCCEEDED( hr ) && spIDispatchDoc ) {
        CComPtr<IHTMLDocument2> spIHTMLDocument2;
        hr = spIDispatchDoc.QueryInterface<IHTMLDocument2>( &spIHTMLDocument2 );
        if ( SUCCEEDED( hr ) && spIHTMLDocument2 ) {
            CComPtr<IHTMLElementCollection> spIHTMLElementCollection;
            hr = spIHTMLDocument2->get_forms( &spIHTMLElementCollection );
            if ( SUCCEEDED( hr ) && spIHTMLElementCollection ) {
                 [...]
            }
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20486772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档