2016-10-31 5 views
0

"GetUrlCacheEntryInfo"という関数で与えられた情報を表示しようとしましたが、機能していません。デバッグログの文字しか表示されません。すべてのデータを正しく印刷するにはどうすればよいですか?GetUrlCacheEntryInfo usage

+0

は、あなたが提供することができます –

答えて

0

ここには、私が自分のキャッシュで見つけたURL(https://h6.msn.com/library/8.8/dapmsn.js)を使った作業サンプルがあります(私はIEを使用しないので、これは最初にFindFirstUrlCacheEntryです)。なぜなら、多分あなたはワイド文字列印刷機能を使用していないということです。あなたは(下のサンプルでstd::coutstd::wcoutの使用を参照)に応じてそれらを印刷する必要がありますのでlpszSourceUrlNamelpszLocalFileNameフィールドはワイド文字列フィールドです。

#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; 
} 
+0

URLDownloadToFileがappd内のファイルをダウンロードする理由を知っていますか?それらを指定されたパスに直接ダウンロードするのではなく、ata(iecache)ですか? – GDaniel

+0

私がダウンロードしたファイルのlocatonを見つけ、その後、 – GDaniel

+0

に@GDanielないアイデアを、それを移動しないと思ったので、私はgeturlcacheentryinfoについて尋ねた、と明示的な URLDownloadToCacheFile機能があるので、私は本当に URLDownloadToFileがキャッシュにファイルを置く必要がある理由を知りません。リターンコードとは何ですか?あなたは最後の引数としてコールバックインターフェイスを提供していますか? –