none
ce下浏览器的问题 RRS feed

  • 问题

  • 最近写了一个在WINCE下的浏览器,目的是想获得网页的源文件,进而再对其中的元素进行读取。

    使用CreateContro()在对话框中建立的,已经获得了WebBrowser的指针,能打开网页、做导航等,现在用指针执行get_Document()方法,获得IDispatch指针(这是成功的),进而去QueryInterface(),获得IHTMLDocument2的指针,到这时就出错了,用GetLastError()返回值:6。调了很长时间都不行,郁闷啊~

    还是在ce下就没有什么办法去获得网页源文件?

    或是能,但我的这种实现不知错再何处?

     请教有没有其他什么办法实现目的?

    2008年7月31日 12:54

答案

  • 在使用COM的时候,如果QI不到,应该看HRESULT返回值,而不是看Last Error,一般情况下Last Error没有意义。

    PB自带的IE Sample里面有取得这个接口的代码

     


    void CleanupPath(LPWSTR pszPath);
    HRESULT CMainWnd:Big SmileoSaveAs()
    {
        HRESULT hr;
        VARIANT vTitle;
        IDispatch *pDisp = NULL;
        IHTMLDocument2 *pDoc = NULL;
        BSTR bstrTitle = NULL;
       
        hr = _pBrowser->get_Document(&pDisp);  
        if(FAILED(hr) || !pDisp)
            goto Exit;

        hr = pDisp->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDoc);
        if(FAILED(hr))
            goto Exit;

        hr = pDoc->get_title(&bstrTitle);
        if(FAILED(hr))
            goto Exit;

        vTitle.vt = VT_BSTR;
        vTitle.bstrVal = NULL;
        if(bstrTitle && bstrTitle[0])
        {
           
            CleanupPath(bstrTitle);
            vTitle.bstrVal = bstrTitle;
         }
        
         hr = _pBrowser->ExecWB(OLECMDID_SAVEAS, OLECMDEXECOPT_DODEFAULT, &vTitle, NULL);

    Exit:
        if(pDisp)
            pDisp->Release();
        if(pDoc)
            pDoc->Release();
        if(bstrTitle)
            SysFreeString(bstrTitle);
           
        return hr;
    }

     

    我怀疑是否是楼主在系统定制的时候,没有选择合适的组件?楼主用的是Pocket IE还是IE6 for WinCE?

     

    2008年8月1日 7:18
    版主

全部回复

  • 在使用COM的时候,如果QI不到,应该看HRESULT返回值,而不是看Last Error,一般情况下Last Error没有意义。

    PB自带的IE Sample里面有取得这个接口的代码

     


    void CleanupPath(LPWSTR pszPath);
    HRESULT CMainWnd:Big SmileoSaveAs()
    {
        HRESULT hr;
        VARIANT vTitle;
        IDispatch *pDisp = NULL;
        IHTMLDocument2 *pDoc = NULL;
        BSTR bstrTitle = NULL;
       
        hr = _pBrowser->get_Document(&pDisp);  
        if(FAILED(hr) || !pDisp)
            goto Exit;

        hr = pDisp->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDoc);
        if(FAILED(hr))
            goto Exit;

        hr = pDoc->get_title(&bstrTitle);
        if(FAILED(hr))
            goto Exit;

        vTitle.vt = VT_BSTR;
        vTitle.bstrVal = NULL;
        if(bstrTitle && bstrTitle[0])
        {
           
            CleanupPath(bstrTitle);
            vTitle.bstrVal = bstrTitle;
         }
        
         hr = _pBrowser->ExecWB(OLECMDID_SAVEAS, OLECMDEXECOPT_DODEFAULT, &vTitle, NULL);

    Exit:
        if(pDisp)
            pDisp->Release();
        if(pDoc)
            pDoc->Release();
        if(bstrTitle)
            SysFreeString(bstrTitle);
           
        return hr;
    }

     

    我怀疑是否是楼主在系统定制的时候,没有选择合适的组件?楼主用的是Pocket IE还是IE6 for WinCE?

     

    2008年8月1日 7:18
    版主
  • 我是一个新手,怕对组件包含的不全,对于定制也是抱着“什么都加”的心态,在PB下的"Catalog"中的"Internet Client Services"->"Browser Application"中是有:pocket ie 和ie6 for wince,因为不了解我都选上了。在"Internet Client Services"中除了关于"TV_Style"的一些组件没选之外,其他全选了。不知妥否~?

    其实这之前还有一个问题:我在用:“_pBrowser->ExecWB(OLECMDID_SAVEAS, OLECMDEXECOPT_DODEFAULT, NULL, NULL)”这个方法时,总是不执行,但是对于Stick out tongueBrowser->ExecWB(OLECMDID_CLOSE, OLECMDEXECOPT_DODEFAULT, NULL, NULL)”却可以执行,也只有这个可以执行。对于_pBrowser->GoHome()之类的都可以执行。不知是否和COM有了联系。

    故说一下我的方式:我在基于对话框的程序中,用CreateControl(),建立了一个关于WebBrowser的控件,得到了他的指针:_pBrowser,然后做一些_pBrowser->GoHome()之类的,再想进一步获得网页的内容,去_pBrowser->get_Document(&pDisp),(没有报错),再pDisp->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDoc);就不行了。是不是和CreateContro()有关系?在这其中没有和COM有什么联系啊(我不是很熟)!?在定制系统时关于COM的组件也是“什么都加”!或许还有我没有加到的组件!?

    以上问题在编译的时候没错,但总时在执行过程中没有反应,形如:打开了一个网页,保存时没有反应。

    恳请...

                                                                                                                        jigsong@gmail.com

                  

    2008年8月1日 12:31
  • 我重新定制了一下内核,只选了IE6 for WinCE,重新编译,生成SDK,然后再试都没有问题了。

     

    2008年8月5日 5:13