如何使用C ++获取IE历史记录

时间:2014-03-22 18:01:50

标签: c++ windows internet-explorer

我正在寻找一种使用c ++代码从Internet Explorer获取浏览历史记录的方法,其他浏览器使用数据库,但IE呢?

谢谢!

1 个答案:

答案 0 :(得分:2)

使用名为IUrlHistoryStg的COM接口。


质量差,但这是如何正确枚举IE历史记录的简单示例。

int main()
{
    CoInitialize(NULL);

    IUrlHistoryStg* ieHistory = NULL;
    HRESULT hr = CoCreateInstance(CLSID_CUrlHistory, NULL, CLSCTX_ALL, IID_IUrlHistoryStg, (LPVOID *)(&ieHistory));

    if (!SUCCEEDED(hr))
        return 1;

    IEnumSTATURL* urlEnumer;
    hr = ieHistory->EnumUrls(&urlEnumer);

    if (!SUCCEEDED(hr))
        return 2;

    if (!SUCCEEDED(urlEnumer->SetFilter(L"", STATURL_QUERYFLAG_ISCACHED|STATURL_QUERYFLAG_TOPLEVEL|STATURL_QUERYFLAG_NOURL|STATURL_QUERYFLAG_NOTITLE|STATURLFLAG_ISTOPLEVEL|STATURLFLAG_ISCACHED)))
        return 4;

    if (!SUCCEEDED(urlEnumer->Reset()))
        return 3;

    unsigned long correct = 0;
    STATURL result = {};

    struct Urls
    {
        std::wstring url;
        std::wstring title;

        Urls(LPWSTR url, LPWSTR title) : url(url ? url : L""), title(title ? title : L"")
        {}
    };

    std::vector<Urls> urls;

    do
    {
        result.cbSize = sizeof(result);
        if (SUCCEEDED(urlEnumer->Next(1, &result, &correct)))
        {
            Urls url(result.pwcsUrl, result.pwcsTitle);
            urls.push_back(url);
        }
    } 
    while (correct == 1);

    size_t size = urls.size();
    ieHistory->Release();
    urlEnumer->Release();

    return 0;
}

在使用之前,请阅读文档并添加更合适的错误处理。


另请here阅读有关COM的内容。