各位大侠,我做了一个使用WEB BROSWER控件获取html源文件的代码,目标是将其保存在本地文件里,代码如下:
IHTMLDocument2 *pHTMLDocument=NULL; 
IPersistStreamInit *pPSI=NULL; 
ULONG ActualTextLength = 0; 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(NULL, TRUE, &pStream);//将内存与流绑定 
pPSI->Save(pStream, FALSE);//保存html到流对象         CString strMsg;
pStream->Read(strMsg.GetBuffer(),10000,&ActualTextLength);//我想把pStream流中的内容保存在CString 或是一个指针中
CString strPrint;
strPrint.Format("ActualTextLength:%d!", ActualTextLength);
AfxMessageBox( strPrint, MB_OK );        writefile(....);
不过ActualTextLength的值始终为0,感觉是没有读到东西,不知道是不是pStream的函数我没有用对?应该怎么改?
CreateStreamOnHGlobal函数的第一个参数我用的是NULL,是在其它帖子里看见的,我主要是因为不知道怎么获取网页的大小(请指点),又想让内存分配可以适应网页(不用分一个固定的很大的值,比如:10000...),所以创建了流后,想将其的内容保存在CString ,不知道用的对不对?

解决方案 »

  1.   

    用IStream::stat可以获取流中的数据占用的内存大小。
    IStream直接读入到CString中可能存在风险,因为流里面保存的字符串可能是任何编码类型,ANSI/UTF-8/UTF-16...等等,保存成文件是没问题的,要保存到字符串应该直接调用
    IHTMLDocument3::get_documentElement 后再调用get_outerHTML获得UNICODE字符串。
      

  2.   


    #include <stdio.h>
    #include <windows.h>
    #include <wininet.h>
    #pragma comment(lib,"Wininet.lib")
    #include <vector>
    using namespace std; 
    int main(int argc, char* argv[])
    {
        vector<char> v;
        CHAR szUrl[] = "http://www.baidu.com/";
        CHAR szAgent[] = "";
        HINTERNET hInternet1 = 
            InternetOpen(NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,NULL);
        if (NULL == hInternet1)
         {
            InternetCloseHandle(hInternet1);
            return FALSE;
         }
        HINTERNET hInternet2 = 
            InternetOpenUrl(hInternet1,szUrl,NULL,NULL,INTERNET_FLAG_NO_CACHE_WRITE,NULL);
        if (NULL == hInternet2)
         {
            InternetCloseHandle(hInternet2);
            InternetCloseHandle(hInternet1);
            return FALSE;
         }
        DWORD dwMaxDataLength = 500;
        PBYTE pBuf = (PBYTE)malloc(dwMaxDataLength*sizeof(TCHAR));
        if (NULL == pBuf)
         {
            InternetCloseHandle(hInternet2);
            InternetCloseHandle(hInternet1);
            return FALSE;
         }
        DWORD dwReadDataLength = NULL;
        BOOL bRet = TRUE;
        do 
        {
            ZeroMemory(pBuf,dwMaxDataLength*sizeof(TCHAR));
            bRet = InternetReadFile(hInternet2,pBuf,dwMaxDataLength,&dwReadDataLength);
            for (DWORD dw = 0;dw < dwReadDataLength;dw++)
             {
                v.push_back(pBuf[dw]);
             }
         } while (NULL != dwReadDataLength);
        char *str = new char[v.size+1];
        copy(v.begin(),v.end(), str);
        str[v.size()]=0;
        
        HANDLE hFile = CreateFile(_T("C:\\MyFile.txt"), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);//创建文本文件
         CFile myFile(hFile); 
        myFile.Write(str, lstrlen(str));//将文本写入文件
        myFile.Close();//关闭流
        return 0;

    这个是把www.baidu.com的源代码写如C:\MtFile.txt中
      

  3.   

    谢谢各位的帮助,但是问题没有解决,新代码如下:
    ULONG ActualTextLength = 0;
    m_wndBrowser.Navigate(("www.baidu.com"),NULL,NULL,NULL,NULL);
    IHTMLDocument2 *pHTMLDocument=NULL; 
    IPersistStreamInit *pPSI=NULL;  IStream *pStream=NULL; 
    HGLOBAL hHTMLText;  if (!(pHTMLDocument = (IHTMLDocument2*)m_wndBrowser.get_Document())) //获取Document 
    return 1;  if (FAILED(pHTMLDocument->QueryInterface(&pPSI))) //获取IPersistStreamInit 指针 

    // pHTMLDocument->Release(); 
    return 1; 
    }  CreateStreamOnHGlobal(NULL, TRUE, &pStream);//将内存与流绑定 
    pPSI->Save(pStream, FALSE); STATSTG statstg;
    pStream->Stat(&statstg,STATFLAG_DEFAULT); //CString str.Format("%s%s",statstg.cbSize.HighPart,statstg.cbSize.LowPart);
    ActualTextLength=statstg.cbSize.LowPart;//assume<4GB   
    unsigned char* ptext= new unsigned char[ActualTextLength+1];  
    memset(ptext,NULL,(ActualTextLength+1)); ULONG ReadSize = 0;
    pStream->Read(ptext,ActualTextLength,&ReadSize);使用Stat后,可以得到网页大小-->ActualTextLength(3397),但是使用Read的时候ReadSize的值始终为0,ptext中也没有网页,这是怎么回事儿,指点指点,急!
      

  4.   

    大虾,你说的“IHTMLDocument3::get_documentElement 后再调用get_outerHTML获得UNICODE字符串。”其中的IHTMLDocument3接口我应该怎么获取?
      

  5.   

    IHTMLDocument2::QueryInterface --> IHTMLDocument3