Использование GetUrlCacheEntryInfo

Я попытался распечатать информацию, предоставленную функцией под названием "GetUrlCacheEntryInfo", но она не работает, она выводит мне только символ в журнале отладки. Как правильно распечатать все данные?

1 ответ

Вот рабочий пример с URL-адресом ( https://h6.msn.com/library/8.8/dapmsn.js), который я обнаружил в своем кэше (поскольку я не использую IE, это было первое, что я получил от FindFirstUrlCacheEntry, Возможная проблема, почему вы можете печатать только один символ, заключается в том, что, возможно, вы не используете функции печати широких строк. lpszSourceUrlName а также lpszLocalFileName поля - это широкие строковые поля, поэтому вы должны напечатать их соответственно (см. использование std::cout а также std::wcout в образце ниже).

#include <Windows.h>
#include <Wininet.h>

#include <memory>

#pragma comment(lib, "Wininet.lib")

#include <iostream>

bool GetUrlCacheEntryInfo(const wchar_t* pUrl, std::unique_ptr<unsigned char[]>& pUrlCacheEntryInfo, DWORD nBufferSize = sizeof(INTERNET_CACHE_ENTRY_INFO))
{
    std::unique_ptr<unsigned char[]> pTemporaryUrlCacheEntryInfo(new unsigned char[nBufferSize]);
    if (GetUrlCacheEntryInfo(pUrl, reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(pTemporaryUrlCacheEntryInfo.get()), &nBufferSize) == FALSE)
    {
        const DWORD nError = GetLastError();
        if (nError == ERROR_INSUFFICIENT_BUFFER)
        {
            pTemporaryUrlCacheEntryInfo.reset(new unsigned char[nBufferSize]);
            if (GetUrlCacheEntryInfo(pUrl, reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(pTemporaryUrlCacheEntryInfo.get()), &nBufferSize) == FALSE)
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
    pUrlCacheEntryInfo = std::move(pTemporaryUrlCacheEntryInfo);
    return true;
}

void PrintUrlCacheEntryInfo(LPINTERNET_CACHE_ENTRY_INFO pUrlCacheEntryInfo)
{
    std::cout << "Cache Entry Info:\n\tSize: " << pUrlCacheEntryInfo->dwStructSize << "\n\tUrl: ";
    std::wcout << pUrlCacheEntryInfo->lpszSourceUrlName;
    std::cout << "\n\tLocal File:";
    std::wcout << pUrlCacheEntryInfo->lpszLocalFileName;
    std::cout << "\n\tType: ";
    switch (pUrlCacheEntryInfo->CacheEntryType)
    {
    case EDITED_CACHE_ENTRY:
        std::cout << "EDITED_CACHE_ENTRY";
        break;
    case SPARSE_CACHE_ENTRY:
        std::cout << "SPARSE_CACHE_ENTRY";
        break;
    case STICKY_CACHE_ENTRY:
        std::cout << "STICKY_CACHE_ENTRY";
        break;
    case TRACK_OFFLINE_CACHE_ENTRY:
        std::cout << "TRACK_OFFLINE_CACHE_ENTRY";
        break;
    case TRACK_ONLINE_CACHE_ENTRY:
        std::cout << "TRACK_ONLINE_CACHE_ENTRY";
        break;
    default:
        std::cout << "UNKNOWN";
        break;
    }
    std::cout << "\n\tHeaders: ";
    std::wcout << pUrlCacheEntryInfo->lpHeaderInfo;
    std::cout << "\n";
}

int main(int argc, char** argv)
{
    const wchar_t* pUrl = L"https://h6.msn.com/library/8.8/dapmsn.js";
    std::unique_ptr<unsigned char[]> pUrlCacheEntryInfo;
    if (GetUrlCacheEntryInfo(pUrl, pUrlCacheEntryInfo))
    {
        PrintUrlCacheEntryInfo(reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(pUrlCacheEntryInfo.get()));
    }
    else
    {
        std::wcout << L"Cache entry for url " << pUrl << L" was  not found!\n";
    }
    return EXIT_SUCCESS;
}
Другие вопросы по тегам