jiangsheng在不在?masterz在吗?
问题1,我要把网页里的script的源代码弄出来,用IHTMLDocument2::get_scripts(IHTMLElementCollection** p);获得script的集合,然后我一个一个地item出每个IHTMLElement指针,最后用IHTMLElement::get_innerHTML获得源代码。可是每次都得到一行5、6个字符的乱码。谁能告诉我如何把HTML里的script源代码弄出来?
问题2,想不起来了,想起来再问

解决方案 »

  1.   

    bcg上都被你炒翻了,老实交待,偷了几个mm?
      

  2.   

    get_innerHTML取得的是Unicode格式的字符串。要经过转换才能显示。CString str = bstr;
    MessageBox(bstr);看看
      

  3.   

    上面 
      MessageBox(bstr);
    应该是
      MessageBox(str);
      

  4.   

    #import <mshtml.tlb>
    ...//class CViewScriptSrcView : public CHtmlViewvoid CViewScriptSrcView::OnViewscriptsrc() 
    {
    LPDISPATCH lpdisp=this->GetHtmlDocument();
    MSHTML::IHTMLDocument2Ptr pdoc2(lpdisp);
    lpdisp->Release();
    MSHTML::IHTMLElementCollectionPtr pcoll=pdoc2->Getscripts();
    long lcount;
    pcoll->get_length(&lcount);
    if(lcount>0)
    {
    IDispatchPtr disp=pcoll->item(COleVariant(short(0)),COleVariant((short)0));
    MSHTML::IHTMLScriptElementPtr script(disp);
    BSTR bstrsrc;
    script->get_text(&bstrsrc);
    _bstr_t bsr2(bstrsrc);
    ::MessageBox(NULL,bsr2,"scriptsrc",MB_OK);
    SysFreeString(bstrsrc);
    }
    }
      

  5.   

    张大哥,你看我这个为什么不行?我不想用mshtml.tlb#include <mshtml.h>
    ...//class CViewScriptSrcView : public CHtmlViewvoid CViewScriptSrcView::OnViewscriptsrc() 
    {
    IHTMLDocument2* pDoc2 = (IHTMLDocument2* )this->GetHtmlDocument();
                    if(pDoc2 == NULL)
                         return; IHTMLElementCollection  * pAllElem = NULL;
    IHTMLElement *pElem = NULL; pDoc2->get_scripts(&pAllElem);
    if(pAllElem!=NULL)
    {
    long p;
    VARIANT name;
    name.vt = VT_I4;
    pAllElem->get_length(&p);
    if(p>0)
    {
    for(int i=0; i<p; i++)
    {
    name.lVal = i;
    if(pAllElem->item(name, name, (LPDISPATCH*)&pElem)==S_OK)
    {
    if(pElem != NULL)
    {
                                                                                                    BSTR bstr;
    pElem->get_innerHTML(&bstr);
                                                                                                    AfxMessageBox(CString(bstr));//5、6个乱字符 
                                                                                                    ::SysFreeString(bstr);
    pElem->Release();
    pElem = NULL;
    }
    }
    }
    }
    pAllElem->Release();
    pAllElem = NULL;
    }
      
                    pDoc2->Release();
    }
      

  6.   

    老错误了
    if(pAllElem->item(name, name, (LPDISPATCH*)&pElem)==S_OK)
    这里错了,你不能把COM接口指针强制转换的,即使一个接口的对象总是支持另外一个接口。
    CComQIPtr<IDispatch> pDispTemp;
    if(m_pLastForm->item(_variant_t(_bstr_t("check")),varDummy,&pDispTemp.p)==S_OK){
    CComQIPtr<IHTMLInputHiddenElement> pInput(pDispTemp);
    if(pInput){
    pInput->put_value(bstrTime);
    }
    }
      

  7.   

    对于这个问题的解释
    struct IA:public IUnknown
    {};
    struct IB:public IUnknown
    {};
    CA:public IA{};
    CB:public IB{};
    struct IC:public IUnknown
    {
    };
    CC:public IC
    {
      A a;
      B b;
      HRESULT QueryInterface(REFIID riid, LPVOID* obp);
    );HRESULT CC::QueryInterface(REFIID riid, LPVOID* obp)
    {
     *ppv=NULL; 
                if (riid == IID_IUnknown) 
                    *ppv=this; 
                if (riid == IID_IA) 
                    *ppv=&a; 
                if (riid == IID_IB) 
                    *ppv=&b; 
                if (NULL==*ppv) 
                    return ResultFromScode(E_NOINTERFACE); 
                ((IUnknown*)*ppv)->AddRef(); 
                return NOERROR;   
       }
     
    }