標籤:style blog io ar color os 使用 sp for
程式中用了IE的核心,想取出網站中的驗證碼圖片,單獨顯示出來,調研了以下幾路方法
1、枚舉所有快取檔案,進行處理,找到想要的,核心代碼
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.\r\n"), dwError); TRACE(strError); bDone = TRUE; break; if(bDone) break; Sleep(10); if(lpCacheEntry){ delete [] lpCacheEntry; lpCacheEntry = NULL;} if(hCacheDir){ FindCloseUrlCache(hCacheDir); hCacheDir = NULL;} break; } }}
2、直接取某個URL對應的緩衝資源
if (1)//這段代碼可以直接從緩衝找到對應URL的圖片資源的路徑{ 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; }}
3、在網頁建立一canvas,將圖片繪上,然後toDataURL,這樣可以得到png格式的,經過base64編碼後的字串,該方法只能在ie9以上使用
if (0)//這段代碼只能在IE9以上運行,可以將圖片繪到canvas上,再取出png格式經base64編碼後的資料 //然後解碼,存到檔案中,就得到一個png圖片 //HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION //設定對應程式的dword值為10001為強制ie10,9999為強制ie9,8888為強制ie8{ CDispatch dispCanvas = disp.InvokePtr(L"createElement", L"canvas"); dispCanvas.Put(L"width", dispImg.Get(L"naturalWidth")); dispCanvas.Put(L"height", dispImg.Get(L"naturalHeight")); CDispatch dispCtx = dispCanvas.InvokePtr(L"getContext", L"2d"); dispCtx.Invoke(L"drawImage", dispImg.p, 0, 0); CString sData = dispCanvas.Invoke(L"toDataURL", L"image/png"); sData = sData.Right(sData.GetLength() - 22); int nBuffer = sData.GetLength() + 1; byte* buffer = new byte[nBuffer]; memset(buffer, 0, nBuffer); Base64Decode(sData, sData.GetLength(), buffer, &nBuffer); CFile f("1.png", CFile::modeCreate|CFile::modeWrite); f.Write(buffer, nBuffer); delete[] buffer;}
Trident核心中取驗證碼圖片的幾種方法