各位大虾,帮帮忙:
IHTMLDocument2 *pHTMLDocument=NULL; 
IPersistStreamInit *pPSI=NULL; IStream *pStream=NULL; 
HGLOBAL hHTMLText; if (!(pHTMLDocument = (IHTMLDocument2*)m_wndBrowser.get_Document())) //获取Document 
return; if (FAILED(pHTMLDocument->QueryInterface(&pPSI))) //获取IPersistStreamInit 指针 

// pHTMLDocument->Release(); 
return; 
} hHTMLText = GlobalAlloc(GMEM_FIXED, 10000);//分配内存 
memset((char*)hHTMLText,NULL,10000);//初始化清空 
CreateStreamOnHGlobal(hHTMLText, TRUE, &pStream);//将内存与流绑定 
pPSI->Save(pStream, FALSE); 我使用上述代码,可以将网页保存在hHTMLText中,不过我想问问如何通过IHTMLDocument2 获取网页的大小,因为GlobalAlloc函数我使用的是一个定值,如果可以基于网页大小分配就比较好了!

解决方案 »

  1.   

    nt CHotDlgNews::NewMsg(CString strMsg)
    {
    m_ocxMsg.Navigate(("about:blank"),NULL,NULL,NULL,NULL);CComPtr<IDispatch> spDisp = m_ocxMsg.get_Document();  if(spDisp != NULL)
    {
    CComQIPtr<IPersistStreamInit> spPersistStream(spDisp);
    if (spPersistStream != NULL)
    {
    LPTSTR lpMem = (LPTSTR)::GlobalAlloc( GPTR,strMsg.GetLength()+1);
    lstrcpy(lpMem,strMsg.GetBuffer());
    CComPtr<IStream>spStream;
    CreateStreamOnHGlobal( lpMem, TRUE, &spStream );
    // 初始化后,装载显示
    spPersistStream->InitNew();
    spPersistStream->Load(spStream ); 
    }
    }
      

  2.   

    oyljerry ,非常感谢!
    还想问你两个问题:
    1:如果我想把IStream中的内容保存在文件里,应该怎么弄?最好可以提供点儿IStream的开发资料;
    2:我想把网页中的参数提取出来或是设置新参数,使用IHTMLDocument2 接口可不可以,应该怎么做,我看了很久MSDN,感觉有点晕,能不能提供点儿IHTMLDocument2 的开发资料?或是介绍一下向这些接口的学习经验,非常感谢!
      

  3.   

    1.IStream Save
    2.IHtmlDocument2 getElementsByTagName()
      

  4.   

    CreateStreamOnHGlobal的第一个参数可以设置为NULL,你不需要知道内存大小,也不用提前分配内存句柄。然后直接调用pPSI->Save()即可。把一个IStream存成文件也是很简单的,调用Read读取数据后直接WriteFile。
      

  5.   

    oyljerry,我按照你说的示例代码做了一下:
    GetHtmlSrc(CExplorer_t &ExplorerObj ,CString strMsg)
    {
    //m_ocxMsg.Navigate(("about:blank"),NULL,NULL,NULL,NULL);  CComPtr <IDispatch> spDisp = ExplorerObj.get_Document();  if(spDisp != NULL) 

    CComQIPtr <IPersistStreamInit> spPersistStream(spDisp); 
    if (spPersistStream != NULL) 

    LPTSTR lpMem = (LPTSTR)::GlobalAlloc( GPTR,strMsg.GetLength()+1);
    lstrcpy(lpMem,strMsg.GetBuffer());  CComPtr <IStream>spStream; 
    CreateStreamOnHGlobal( lpMem, TRUE, &spStream ); 
    // 初始化后,装载显示 
    spPersistStream->InitNew(); 
    spPersistStream->Load(spStream ); ::MessageBox(NULL,_T(strMsg),_T("test"),MB_OK); spStream.Release(); 
    spPersistStream.Release();
    }
    } return 0;
    }这个函数用于获取html src并显示主调函数为
    m_wndBrowser.Navigate(("www.baidu.com"),NULL,NULL,NULL,NULL); 
    CString HtmlSrc("");
    GetHtmlSrc(m_wndBrowser,HtmlSrc);其中的m_wndBrowser为web browser控件变量。不过运行时html源代码始终无法获取,我发现strMsg的内容始终没有,按照理解GlobalAlloc函数的第二个参数是内存大小,这里的调用中为1,请问如果内存初始大小为1,后面的IStream操作中如果保存的网页大小大于原有内存大小(这里为1),是不是会自动分配新的内存?
    或者就是对于你的示例代码我的理解错误了,示例中的CString应该怎么初始化?另外一个问题就是GetHtmlSrc的函数体不变,不过声明如果第一个参数CExplorer_t ExplorerObj 不是引用,VS2005会报错,这是怎么回事儿?错误代码:error C2248: “CObject::CObject”: 无法访问 private 成员还有问题就是:
    IHtmlDocument2 和IPersistStreamInit 这些是什么东东,我的理解就是控件提供的使用接口(实际操作就是基于控件生成一个类变量,该类就提供了控件的使用接口,不知道对不对?)这些好象是COM接口吧,这方面我一直不清楚,设计思想是什么,有什么功能,怎么用,能不能说的详细准确一点儿,最好提供一点儿学习的资料,我想好好看看,补补!非常感谢。