WebBrowser中取对应的图片资源

在客户端中使用webbrower控件,控件中已显示网页,对应的图片资源应已下载完,下面从缓存中找到图片资源,两种方法都可

1、GetUrlCacheEntryInfo

http://msdn.microsoft.com/en-us/library/aa384185(v=vs.85).aspx

2、FindFirstUrlCacheEntry、FindNextUrlCacheEntry、FindCloseUrlCache

http://msdn.microsoft.com/zh-SG/library/aa384026

void CTesthaijiaDlg::OnDocumentComplete(LPDISPATCH pDisp, LPCTSTR szUrl)
{
    if (pDisp == m_pBrowserApp)
    {
        CString sCheckUrl(szUrl);
        if (sCheckUrl.CompareNoCase(sLoginUrl) == 0)
        {
            if (m_spHtmlDoc)
            {
                CDispatch disp = m_spHtmlDoc;
                disp.InvokePtr(L"getElementById", L"txtUserName").Put(L"value", L"abc");
                disp.InvokePtr(L"getElementById", L"txtPassword").Put(L"value", L"abc");

                  CDispatch dispImg = disp.InvokePtr(L"getElementById", L"ValidIMG");
                 CString s = dispImg.Get(L"src");
                if (1)
                {
                    LPINTERNET_CACHE_ENTRY_INFO lpCacheEntry = NULL;
                    DWORD dwEntrySize = 4096;
                    lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwEntrySize];
                    lpCacheEntry->dwStructSize = dwEntrySize;
                    BOOL b = GetUrlCacheEntryInfo(s, lpCacheEntry, &dwEntrySize);
                    CString sPath = lpCacheEntry->lpszLocalFileName;

                    RECT rc1;
                    SystemParametersInfo(SPI_GETWORKAREA,0,(PVOID)&rc1,0);
                    SetWindowPos(NULL, 0, rc1.bottom - 4, 0, 0, SWP_NOSIZE);
                                        
                    CDlgCode dlg;
                    dlg.SetPath(sPath);
                    if (dlg.DoModal() == IDOK)
                    {
                        disp.InvokePtr(L"getElementById", L"txtIMGCode").Put(L"value", CComVariant(dlg.m_sCode));
                        disp.InvokePtr(L"getElementById", L"BtnLogin").Invoke(L"click");
                        SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOSIZE);
                    }
                }
                if (0)
                {
                    LPINTERNET_CACHE_ENTRY_INFO lpCacheEntry = NULL;
                    HANDLE hCacheDir = NULL;
                    DWORD dwTrySize, dwEntrySize = 4096;
                    DWORD dwError = ERROR_INSUFFICIENT_BUFFER;
                    BOOL bSuccess, bDone = FALSE; //是否已经处理完,初始设为false
                    while(!bDone){
                        switch(dwError){
                        case ERROR_INSUFFICIENT_BUFFER:     
                            if(lpCacheEntry) 
                            {
                                delete [] lpCacheEntry;
                            }
                            lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwEntrySize];
                            lpCacheEntry->dwStructSize = dwEntrySize;
                            dwTrySize = dwEntrySize;
                            if(!hCacheDir)
                            {//为空,说明第一次执行,需要找第一个
                                hCacheDir = FindFirstUrlCacheEntry(NULL,lpCacheEntry,&dwTrySize);
                                bSuccess = (hCacheDir != NULL);
                            }
                            else 
                            {
                                bSuccess = FindNextUrlCacheEntry(hCacheDir,lpCacheEntry,&dwTrySize);
                            }
                            if(!bSuccess){
                                dwError = GetLastError();
                                dwEntrySize = dwTrySize; //使用得到的新长度 
                            }
                            else 
                            {
                                dwError = ERROR_SUCCESS;
                            }
                            break; 
                            //we are done
                        case ERROR_NO_MORE_ITEMS:
                            bDone = TRUE;
                            break;
                            //we have got an entry
                        case ERROR_SUCCESS:
                            if(bSuccess && (NORMAL_CACHE_ENTRY & lpCacheEntry->CacheEntryType))
                            { //
                                CString sUrl1 = lpCacheEntry->lpszSourceUrlName;
                                if (sUrl1.Compare(s) == 0)
                                {
                                    //处理
                                }
                                //     CTime lastModified(lpCacheEntry->LastModifiedTime);
                                //     CTime lastAccessed(lpCacheEntry->LastAccessTime);
                                //a changed cookie - delete it!
                                //     if(lastModified >= m_time || lastAccessed >= m_time){
                                //const   CString   name   =   lpCacheEntry->lpszSourceUrlName;  
                                //const   CString   result   =   lastModified.Format("%I:%M:%S%p   %d   %b   %Y");  
                                //MessageBox   (NULL,   name   +   "   last   modified   "   +   result,   "Deleting cookie",   MB_OK);  
                                //DeleteUrlCacheEntry(lpCacheEntry->lpszSourceUrlName);
                            }
                            //get ready for next entry
                            dwTrySize = dwEntrySize;
                            if(!FindNextUrlCacheEntry(hCacheDir,lpCacheEntry,&dwTrySize))
                            {
                                dwError = GetLastError();
                                dwEntrySize = dwTrySize;   //使用得到的新长度
                            }
                            else 
                            {
                                dwError = ERROR_SUCCESS;
                            }
                            break;
                            //unknown error
                        default:
                            CString strError; strError.Format(_T("There is an error (%d) when trying deleting temporary internet files.
"),   dwError);  
                            TRACE(strError);
                            bDone = TRUE;
                            break;   
                            if(bDone) 
                                break;
                            Sleep(10);  if(lpCacheEntry){ delete [] lpCacheEntry; lpCacheEntry = NULL;}
                            if(hCacheDir){ FindCloseUrlCache(hCacheDir); hCacheDir = NULL;}
                            break;
                        }
                    }
                }
            }
        }
    }

    CDHtmlDialog::OnDocumentComplete(pDisp, szUrl);
}
原文地址:https://www.cnblogs.com/fatterbetter/p/4118453.html