Я попытался распечатать информацию, предоставленную функцией под названием «GetUrlCacheEntryInfo», но она не работает, она выводит мне только символ в журнале отладки. Как правильно распечатать все данные?
Вот рабочий образец, с 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;
}
Других решений пока нет …