最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++獲取多瀏覽器上網(wǎng)歷史記錄示例代碼(支持獲取IE/Chrome/FireFox)

 更新時(shí)間:2013年11月24日 10:27:59   作者:  
這篇文章主要介紹了C++獲取多瀏覽器上網(wǎng)歷史記錄示例代碼,支持獲取IE, Chrome,FireFox等瀏覽器


復(fù)制代碼 代碼如下:

// FileName: BrowsHistory.h

// ------------------------------------------------------------------------------------------------------------------------
// Remarks:
//   BrowsHistory對(duì)象應(yīng)該設(shè)置成全局,或者靜態(tài);防止還沒(méi)有獲取完網(wǎng)址,對(duì)象就析構(gòu)了;
// ------------------------------------------------------------------------------------------------------------------------


#pragma once
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>

struct BrowsData
{
public:
    // 網(wǎng)址
    CString strURL;

    // 對(duì)應(yīng)網(wǎng)址訪問(wèn)次數(shù)
    unsigned int nCount;

    // 重載<操作符
    bool operator < (const BrowsData &m)const
    {
        return nCount > m.nCount;
    }
};

class BrowsHistory
{
private:

    // 保存獲得的網(wǎng)址和訪問(wèn)次數(shù)
    std::vector<BrowsData> m_BrowsHistroy;

private:

    // IE網(wǎng)址過(guò)濾,如只取網(wǎng)址com前邊的
    void urlFiltrateIE (LPWSTR lpszSourceUrlName);

    // Chrome網(wǎng)址過(guò)濾,如只取網(wǎng)址com前邊的
    void urlFiltrateChrome (CString strUrlName);

    // Firefox網(wǎng)址過(guò)濾,如只去網(wǎng)址com前邊的
    void urlFiltrateFirefox (CString strUrlName, int nCount);

    // 查詢進(jìn)程是否已存在, 返回true表示存在;自動(dòng)結(jié)束其進(jìn)程
    bool IsRunning(CString exe);

    // 編碼轉(zhuǎn)換
    void ConvertUtf8ToGBK(CStringA &strUtf8);

    // 獲取瀏覽器歷史記錄
    void InitHistroy (void);

    // 多線程函數(shù)
    static void ThreadPro (LPVOID * ptr);

    // 對(duì)獲得的網(wǎng)址進(jìn)行排序
    void Sort (void);

public:
    BrowsHistory();
    ~BrowsHistory();

    // 獲取網(wǎng)址的進(jìn)程,是否執(zhí)行完;執(zhí)行完時(shí)為true;
    bool m_bStatus;

    // 初始化
    void Init (void);

    // 獲取瀏覽器歷史記錄
    std::vector<BrowsData> GetBrowsHistory(void) const;
};

復(fù)制代碼 代碼如下:

// // FileName: BrowsHistory.cpp

#include "stdafx.h"                    // 如果編譯出錯(cuò)請(qǐng)刪除此行
#include "BrowsHistory.h"

#include <wininet.h>
#include "Common\\CppSQLite3.h"
#include <shlobj.h>
#include "Shlwapi.h"
#pragma  comment(lib,"Shlwapi.lib")
#include "tlhelp32.h"
#pragma comment(lib,"common\\sqlite3.lib")

#include <atlconv.h>

 

BrowsHistory::BrowsHistory()
{
    m_bStatus = false;
}

BrowsHistory::~BrowsHistory()
{

}

void BrowsHistory::urlFiltrateIE (LPWSTR lpszSourceUrlName)
{
    BrowsData browsDate;
    browsDate.nCount = 0;

    CString strTemp(lpszSourceUrlName);
   

    std::vector<BrowsData>::iterator iter;

    // 排除非必要的網(wǎng)址
    if (strTemp.Find(_T("@http://")) != -1)
    {
        strTemp.Delete(0, strTemp.Find(_T("@http://"))+8);

        // 排除非必要網(wǎng)址
        if (strTemp.Find(_T(":")) != -1)
        {
            return;
        }

        int nIndex = strTemp.Find(_T("/"));
        if (nIndex != -1)
        {
            for (iter=m_BrowsHistroy.begin(); iter != m_BrowsHistroy.end(); iter++)
            {
                if (iter->strURL == strTemp.Left(nIndex))
                {
                    iter->nCount += 1;
                    return;
                }
            }

            browsDate.strURL = strTemp.Left(nIndex);
            browsDate.nCount = 1;
            m_BrowsHistroy.push_back(browsDate);
        }
        else
        {
            for (iter=m_BrowsHistroy.begin(); iter != m_BrowsHistroy.end(); iter++)
            {
                if (iter->strURL == strTemp)
                {
                    iter->nCount += 1;
                    return;
                }
            }

            browsDate.strURL = strTemp;
            browsDate.nCount = 1;
            m_BrowsHistroy.push_back(browsDate);
        }
    }
}

 void BrowsHistory::urlFiltrateChrome (CString strUrlName)
 {
     // 刪除開(kāi)始的"https://"

    if (strUrlName.Find(_T("https://")) != -1)
    {
        strUrlName.Delete(0, 8);
    }
    else if(strUrlName.Find(_T("http://")) != -1)
    {
         strUrlName.Delete(0, 7);
    }

     int nIndex = strUrlName.Find(_T("/"));

    BrowsData browsDate;
    browsDate.nCount = 0;
    std::vector<BrowsData>::iterator iter;

    if (nIndex != -1)
    {
        for (iter=m_BrowsHistroy.begin(); iter != m_BrowsHistroy.end(); iter++)
        {
            if (iter->strURL == strUrlName.Left(nIndex))
            {
                iter->nCount += 1;
                return;
            }
        }

        browsDate.strURL = strUrlName.Left(nIndex);
        browsDate.nCount = 1;
        m_BrowsHistroy.push_back(browsDate);
    }
    else
    {
        for (iter=m_BrowsHistroy.begin(); iter != m_BrowsHistroy.end(); iter++)
        {
            if (iter->strURL == strUrlName)
            {
                iter->nCount += 1;
                return;
            }
        }

        browsDate.strURL = strUrlName;
        browsDate.nCount = 1;
        m_BrowsHistroy.push_back(browsDate);
    }
 }

void BrowsHistory::urlFiltrateFirefox (CString strUrlName, int nCount)
{
    BrowsData browsDate;
    browsDate.nCount = 0;

    int nIndex = strUrlName.Find(_T("/"));
    if (nIndex != -1)
    {
        strUrlName = strUrlName.Left(nIndex);
    }

    std::vector<BrowsData>::iterator iter;
    for (iter=m_BrowsHistroy.begin(); iter != m_BrowsHistroy.end(); iter++)
    {
        if (iter->strURL == strUrlName)
        {
            iter->nCount += nCount;
            return;
        }
    }

    browsDate.strURL = strUrlName;
    browsDate.nCount += nCount;
    m_BrowsHistroy.push_back(browsDate);
}

bool BrowsHistory::IsRunning(CString exe)
{
    PROCESSENTRY32 pe32;
    HANDLE hprocess;
    hprocess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    pe32.dwSize = sizeof(PROCESSENTRY32);

    if(Process32First(hprocess,&pe32))
    {
        do
        {
            HANDLE h_id;
            h_id = OpenProcess(PROCESS_TERMINATE,false,pe32.th32ProcessID);

            CString exefile;
            exefile=pe32.szExeFile;
            exefile.MakeLower();
            exe.MakeLower();
            if(exefile==exe)
            {
                if (TerminateProcess(h_id, 0) !=0)
                {
                    return FALSE;
                }
                else
                {
                    return TRUE;
                }
            }
        }
        while(Process32Next(hprocess,&pe32));
    }
    return FALSE;
}

void BrowsHistory::ConvertUtf8ToGBK(CStringA &strUtf8)
{

    int len=MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)strUtf8, -1, NULL,0);
    unsigned short * wszGBK = new unsigned short[len+1];
    memset(wszGBK, 0, len * 2 + 2);
    MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)strUtf8, -1,(LPWSTR) wszGBK, len);
    len = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
    char *szGBK=new char[len + 1];
    memset(szGBK, 0, len + 1);
    WideCharToMultiByte (CP_ACP, 0, (LPWSTR)wszGBK, -1, szGBK, len, NULL,NULL);
    strUtf8 = szGBK;
    delete[] szGBK;
    delete[] wszGBK;
}

void BrowsHistory::Init (void)
{
    // 創(chuàng)建一個(gè)線程
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadPro, this, 0, NULL);
}

void BrowsHistory::InitHistroy (void)
{

    // 用來(lái)支持多次調(diào)用
    m_bStatus = false;
    m_BrowsHistroy.clear();

    // 獲取IE的歷史記錄
    HANDLE hCacheEnumHandle = NULL;
    LPINTERNET_CACHE_ENTRY_INFO lpCacheEntry = NULL;
    DWORD dwSize = 4096;
    BrowsData browsDate;
    browsDate.nCount = 0;

    lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwSize];
    lpCacheEntry->dwStructSize = dwSize;

    hCacheEnumHandle = FindFirstUrlCacheEntry(_T("visited:"), lpCacheEntry, &dwSize);

    if(hCacheEnumHandle != NULL)
    {
        urlFiltrateIE(lpCacheEntry->lpszSourceUrlName);
    }
    else
    {
        switch(GetLastError())
        {
        case ERROR_INSUFFICIENT_BUFFER:
            lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwSize];
            lpCacheEntry->dwStructSize = dwSize;

            hCacheEnumHandle = FindFirstUrlCacheEntry(_T("visited:"), lpCacheEntry,
                &dwSize);
            if (hCacheEnumHandle != NULL)
            {
                urlFiltrateIE(lpCacheEntry->lpszSourceUrlName);
                break;       
            }
            else
            {
                // 查找失敗
                return;
            }
        default:
            {
                FindCloseUrlCache(hCacheEnumHandle);
            }
        }
    }

    bool bSign = true;
    do
    {

        if (FindNextUrlCacheEntry(hCacheEnumHandle, lpCacheEntry, &dwSize))
        {
            urlFiltrateIE(lpCacheEntry->lpszSourceUrlName);
        }
        else
        {
            switch(GetLastError())
            {
            case ERROR_INSUFFICIENT_BUFFER:
                lpCacheEntry =
                    (LPINTERNET_CACHE_ENTRY_INFO) new char[dwSize];
                memset(lpCacheEntry,0,dwSize);
                lpCacheEntry->dwStructSize = dwSize;


                if (FindNextUrlCacheEntry(hCacheEnumHandle, lpCacheEntry,
                    &dwSize))
                {
                    urlFiltrateIE(lpCacheEntry->lpszSourceUrlName);
                    break;
                }
                else
                {
                    FindCloseUrlCache(hCacheEnumHandle);
                    bSign = false;
                    break;
                }
                break;
            case ERROR_NO_MORE_ITEMS:
                FindCloseUrlCache(hCacheEnumHandle);
                bSign = false;
                break;
            default:
                FindCloseUrlCache(hCacheEnumHandle);
                bSign = false;
                break;
            }
        }
    } while (bSign);

    // 獲取谷歌瀏覽器的歷史記錄
    char path[MAX_PATH];
    ::SHGetSpecialFolderPathA(NULL,path,CSIDL_LOCAL_APPDATA,FALSE);

    strcat_s(path,"\\google\\chrome\\User Data\\default\\History");
    if (PathFileExistsA(path))
    {
        // 谷歌瀏覽器正在運(yùn)行,強(qiáng)制關(guān)閉;關(guān)閉后才能得到谷歌瀏覽器的歷史記錄
        if (!IsRunning(_T("chrome.exe")))
        {
            try
            {
                CppSQLite3DB db;
                CppSQLite3Query query;

                db.open(path);
                query=db.execQuery("select url from urls");

                while(!query.eof())
                {
                    CStringA utf8url;
                    utf8url=query.fieldValue("url");
                    ConvertUtf8ToGBK(utf8url);
                    urlFiltrateChrome((CString)utf8url);
                    query.nextRow();

                }
                db.close();
            }
            catch (CppSQLite3Exception& e)
            {
                return;
            }
        }
    }

    // 獲取火狐瀏覽器的歷史記錄
    TCHAR strPath[MAX_PATH] = {0};

    GetModuleFileName(NULL, strPath, MAX_PATH);
    CString strPathTemp(strPath);

    int nPosition = strPathTemp.ReverseFind(_T('\\'));

    if (nPosition != -1)
    {
        USES_CONVERSION;

        strPathTemp = strPathTemp.Left(nPosition);
        ::SHGetSpecialFolderPathA(NULL, path, CSIDL_WINDOWS, FALSE);
        CString strDestPath(path);

        strPathTemp += _T("\\MozillaCacheView.exe /stext ");
        strDestPath += _T("\\temp.dat");
        strPathTemp += strDestPath;

        // 文件路徑中不能有空格
        WinExec(T2A(strPathTemp), SW_HIDE);

        // 延時(shí),防止讀寫(xiě)沖突
        Sleep(1000);
        if (PathFileExists(strDestPath))
        {
            CStdioFile file;
            CString buffer;
            if(file.Open(strDestPath, CFile::modeRead))
            {
                CString strTemp;
                while(file.ReadString(buffer))
                {
                    if (buffer.Find(_T("image/x-icon")) != -1)
                    {
                        file.ReadString(buffer);
                        buffer.Delete(0, buffer.Find(_T("http://"))+7);

                        file.ReadString(strTemp);
                        file.ReadString(strTemp);
                        strTemp.Delete(0, strTemp.Find(_T(": "))+2);

                        urlFiltrateFirefox(buffer, atoi(T2A(strTemp)));
                    }
                }
            }
        }
    }

    Sort();
}

void BrowsHistory::ThreadPro (LPVOID * ptr)
{
    BrowsHistory * pBrowsHistroy = (BrowsHistory*)ptr;
    pBrowsHistroy->InitHistroy();

    // 獲取網(wǎng)址的函數(shù)執(zhí)行完了
    pBrowsHistroy->m_bStatus = true;
}

std::vector<BrowsData> BrowsHistory::GetBrowsHistory (void) const
{
    return m_BrowsHistroy;
}

void BrowsHistory::Sort (void)
{
    stable_sort(m_BrowsHistroy.begin(), m_BrowsHistroy.end(),std::less<BrowsData>());
}

相關(guān)文章

  • 判斷兩顆二叉樹(shù)是否相似的兩種方法

    判斷兩顆二叉樹(shù)是否相似的兩種方法

    今天小編就為大家分享一篇關(guān)于判斷兩顆二叉樹(shù)是否相似的兩種方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • linux下使用g++編譯cpp工程的方法

    linux下使用g++編譯cpp工程的方法

    這篇文章主要介紹了linux下使用g++編譯cpp工程的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C++深入了解模板的使用

    C++深入了解模板的使用

    這篇文章主要介紹了C++中模板(Template)的詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 利用Matlab繪制地圖的超詳細(xì)教程

    利用Matlab繪制地圖的超詳細(xì)教程

    worldmap和usamap是axesm的子類,worldmap是用于生成世界地圖坐標(biāo)區(qū)域,usamap用于生成美國(guó)地圖坐標(biāo)區(qū)域。本文將詳細(xì)為大家介紹如何利用這兩個(gè)函數(shù)繪制地圖,需要的可以參考一下
    2022-02-02
  • C語(yǔ)言動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn)示例

    C語(yǔ)言動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn)示例

    動(dòng)態(tài)內(nèi)存管理是一種允許程序在運(yùn)行時(shí)根據(jù)需要?jiǎng)討B(tài)申請(qǐng)和回收內(nèi)存的策略,它提供了四種重要的函數(shù),本文就來(lái)介紹一下,感興趣的可以了解一下
    2024-11-11
  • C++多線程獲取返回值方法詳解

    C++多線程獲取返回值方法詳解

    這篇文章主要介紹了C++多線程獲取返回值方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • C++11 模板參數(shù)的“右值引用”是轉(zhuǎn)發(fā)引用嗎

    C++11 模板參數(shù)的“右值引用”是轉(zhuǎn)發(fā)引用嗎

    這篇文章主要介紹了C++11 模板參數(shù)的“右值引用”是轉(zhuǎn)發(fā)引用嗎,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 總結(jié)c++性能優(yōu)化策略

    總結(jié)c++性能優(yōu)化策略

    在本篇文章中小編給大家總結(jié)了關(guān)于C++的性能優(yōu)化策略的相關(guān)知識(shí)點(diǎn),對(duì)此有興趣的朋友可以參考學(xué)習(xí)下。
    2018-03-03
  • C語(yǔ)言利用面試真題理解指針的使用

    C語(yǔ)言利用面試真題理解指針的使用

    C語(yǔ)言這門課程在計(jì)算機(jī)的基礎(chǔ)教學(xué)中一直占有比較重要的地位,然而要想突破C語(yǔ)言的學(xué)習(xí),對(duì)指針的掌握是非常重要的,本文將具體針對(duì)指針的基礎(chǔ)做詳盡的介紹
    2022-08-08
  • C語(yǔ)言宏定義容易認(rèn)不清的盲區(qū)梳理

    C語(yǔ)言宏定義容易認(rèn)不清的盲區(qū)梳理

    宏定義是C提供的三種預(yù)處理(宏定義、文件包含、條件編譯)的其中一種,其主要目的是為程序員在編程時(shí)提供一定的方便,并能在一定程度上提高程序的運(yùn)行效率
    2022-09-09

最新評(píng)論

安义县| 翁牛特旗| 长寿区| 滁州市| 泾川县| 惠东县| 剑阁县| 潮安县| 修武县| 赣榆县| 长葛市| 恩平市| 镇康县| 通许县| 改则县| 阿勒泰市| 丹阳市| 梁山县| 涪陵区| 五家渠市| 黄龙县| 新巴尔虎左旗| 荣成市| 无棣县| 会理县| 乌苏市| 大新县| 郴州市| 陆丰市| 延吉市| 科技| 星座| 于都县| 淮阳县| 平江县| 竹北市| 建昌县| 韩城市| 桐乡市| 霍城县| 慈利县|