Trident核心中取驗證碼圖片的幾種方法

來源:互聯網
上載者:User

標籤: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核心中取驗證碼圖片的幾種方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.