共用方式為


快取 (Windows 因特網)

WinINet 函式具有簡單且有彈性的內建快取支援。 從網路擷取的任何數據會快取在硬碟上,並針對後續請求再次擷取。 應用程式可以控制每個請求的快取。 對於來自伺服器的 HTTP 請求,接收到的大部分標頭也會被快取。 從快取滿足 HTTP 要求時,快取標頭也會傳回給呼叫端。 這可讓數據下載順暢,無論數據來自快取還是來自網路。

應用程式必須使用持續性 URL 快取函式來正確配置緩衝區,才能取得所需的結果。 如需詳細資訊,請參閱 使用緩衝區

回應處理期間的快取行為

WinINet 快取符合 RFC 2616 中所述的 HTTP 快取控制指示詞。 快取控制指示詞和應用程式集旗標會決定可能快取的內容;不過,WinINet 會根據下列準則來判斷實際快取的內容:

  • WinINet 只會快取 HTTP 和 FTP 回應。
  • 只有表現良好的回應可以由快取儲存,並用於後續要求的回復中。 行為良好的回應會定義為成功傳回的回應。
  • 根據預設,WinINet 會快取成功的回應,除非伺服器的快取控制指令或應用程式定義的旗標特別指出該回應不應被快取。
  • 一般而言,若符合上述要求,則 GET 請求的回應會被快取。 在任何情況下,都不會快取PUT和POST請求方法的回應。
  • 即使快取已滿,項目仍然會被快取。 如果新增的項目使快取超過大小限制,則會排程快取清理程序。 預設情況下,項目不保證會在快取中保留超過 10 分鐘。 如需詳細資訊,請參閱下方 快取清理程式 一節。
  • Https 會被預設快取。 這是由無法被應用程式定義快取指示詞覆寫的全域設定所管理。 若要覆寫全域設定,請選取控制面板中的 [因特網選項] 小程式,然後移至 [進階] 索引卷標。核取 [安全性] 區段底下的 [不要將加密頁面儲存到磁碟] 方塊。

快取清理器

快取清除程式會定期清除快取中的專案。 如果項目已新增至快取,且快取已滿,則會將項目新增至快取,並排程快取清理程序。 如果快取清除程式完成一輪清除,快取尚未達到限制,當另一個項目新增至其中時,將安排清除程式執行另一輪。 一般而言,當新增的項目使快取超過其大小限制時,就會排程清理程序。 根據預設,除非在快取控制指示詞中另有指定,否則快取中存留時間下限會設定為 10 分鐘。 起始快取清盤時,不保證最舊的專案是第一個要從快取中刪除的專案。

快取會在電腦上的所有 WinINet 應用程式上共用給同一位使用者。 從 Windows Vista 和 Windows Server 2008 開始,快取大小會設定為磁碟大小 1/32,大小下限為 8MB,大小上限為 50 MB。

使用旗標來控制快取

快取旗標可讓應用程式控制其使用快取的時機和方式。 這些旗標可以單獨使用,或與存取因特網上資訊或資源的函式中的 dwFlags 參數搭配使用。 根據預設,函式會儲存從因特網下載的所有數據。

您可以使用下列旗標來控制快取。

價值 意義
INTERNET_FLAG_CACHE_ASYNC 此旗標沒有任何作用。
如果網路失敗則緩存標誌 如果由於網路要求因 ERROR_INTERNET_CONNECTION_RESETERROR_INTERNET_CANNOT_CONNECT 錯誤而失敗,則從快取中返回資源。 HttpOpenRequest會使用此旗標。
INTERNET_FLAG_DONT_CACHE 不會在本機或任何閘道中快取數據。 與慣用值相同,INTERNET_FLAG_NO_CACHE_WRITE
表示這是表單提交。
INTERNET_FLAG_FROM_CACHEINTERNET_FLAG_FORMS_SUBMIT 不會提出網路要求。 所有實體將從快取中返回。 如果要求的專案不在快取中,則會傳回適當的錯誤,例如ERROR_FILE_NOT_FOUND。 只有 InternetOpen 函式會使用此旗標。
INTERNET_FLAG_FWD_BACK 指出函式應該使用目前在因特網快取中的資源複本。 不會檢查資源的到期日和其他資訊。 如果在因特網快取中找不到要求的項目,系統會嘗試在網路上尋找資源。 這個值是在 Microsoft Internet Explorer 5 中引入的,且與 Internet Explorer 的 前進返回 按鈕操作相關聯。
INTERNET_FLAG_HYPERLINK 如果資源儲存在快取中時,不會傳回任何過期時間,且不會傳回上次修改的時間,則強制應用程式重載資源。
INTERNET_FLAG_MAKE_PERSISTENT 不再支援。
INTERNET_FLAG_MUST_CACHE_REQUEST 如果無法快取檔案,就會建立暫存盤。 這與慣用的值相同,INTERNET_FLAG_NEED_FILE
需要檔案標誌 如果無法快取檔案,就會建立暫存盤。
INTERNET_FLAG_NO_CACHE_WRITE 拒絕任何試圖將從網際網路下載的數據儲存在快取中的功能。 如果應用程式不想在本機儲存任何已下載的資源,則需要此旗標。
INTERNET_FLAG_NO_UI 停用 Cookie 對話框。 HttpOpenRequestInternetOpenUrl 才能使用此旗標(僅限 HTTP 要求)。
INTERNET_FLAG_OFFLINE 防止應用程式將要求傳送至網路。 所有要求都會使用儲存在快取中的資源來解析。 如果資源不在快取中,則會傳回適當的錯誤,例如ERROR_FILE_NOT_FOUND。
INTERNET_FLAG_PRAGMA_NOCACHE 強制要求由原始伺服器解析,即使 Proxy 上已有快取的副本。 InternetOpenUrl 函式(僅限 HTTP 和 HTTPS 要求上)和 HttpOpenRequest 函式會使用此旗標。
INTERNET_FLAG_RELOAD 強制函式直接從因特網擷取要求的資源。 下載的信息會儲存在快取中。
網路旗標重新同步 讓應用程式從因特網執行資源的條件式下載。 如果儲存在快取中的版本是最新的,則會從快取下載資訊。 否則,會從伺服器重載資訊。

 

持久性快取函式

需要永續性快取服務的用戶端會使用永續性快取功能,允許其應用程式在本機檔系統中儲存數據以供後續使用,例如在低頻寬連接限制存取的情況下,或完全無法存取的情況。

快取函式提供持續性快取和離線流覽。 除非 INTERNET_FLAG_NO_CACHE_WRITE 旗標明確指定沒有快取,否則函式會快取從網路下載的所有數據。 POST 資料的回應不會被快取。

使用持久化 URL 快取函數

下列永久性 URL 快取功能可讓應用程式訪問及操作儲存在快取中的資訊。

功能 描述
CommitUrlCacheEntryA 將資料快取到快取儲存中的指定檔案,並將其與指定的URL相關聯。
CommitUrlCacheEntryW 將指定檔案存入快取儲存,並將其與給定的URL相關聯。
創建網址快取項目 分配要求的快取存儲,並建立本地檔案名稱來儲存對應到來源名稱的快取項目。
CreateUrlCacheGroup 產生快取群組識別。
DeleteUrlCacheEntry 如果檔案存在,則會從快取中移除與來源名稱相關聯的檔案。
刪除網址快取群組 釋放 GROUPID 以及快取索引檔案中所有相關的狀態。
FindCloseUrlCache 關閉指定的列舉控制碼。
FindFirstUrlCacheEntry 開始列舉快取內容。
FindFirstUrlCacheEntryEx 開始對快取進行過濾的列舉操作。
FindNextUrlCacheEntry 擷取快取中的下一個條目。
FindNextUrlCacheEntryEx 擷取篩選快取列舉中的下一個項目。
GetUrlCacheEntryInfo 擷取快取條目的相關資訊。
GetUrlCacheEntryInfoEx HttpSendRequest轉譯將在離線模式中套用的任何快取重新導向之後,搜尋URL。
讀取Url緩存條目流 從已使用 RetrieveUrlCacheEntryStream開啟的數據流讀取快取的數據。
RetrieveUrlCacheEntryFile 從快取中擷取以檔案形式呈現的快取項目。
RetrieveUrlCacheEntryStream 提供最有效率且與實作無關的方式來存取快取數據。
SetUrlCacheEntryGroup 新增或移除快取群組中的項目。
SetUrlCacheEntryInfo 設定 INTERNET_CACHE_ENTRY_INFO 結構的指定成員。
UnlockUrlCacheEntryFile 解鎖當檔案透過 RetrieveUrlCacheEntryFile從快取擷取使用時鎖定的快取專案。
UnlockUrlCacheEntryStream 關閉使用 retrieveUrlCacheEntryStream 擷取的數據流

 

列舉緩存

FindFirstUrlCacheEntryFindNextUrlCacheEntry 函式會列舉儲存在快取中的資訊。 FindFirstUrlCacheEntry 會採用搜尋模式、緩衝區和緩衝區大小來建立句柄並傳回第一個快取專案,以啟動列舉。 FindNextUrlCacheEntry 會採用由 FindFirstUrlCacheEntry、緩衝區和緩衝區大小所建立的句柄,以傳回下一個快取條目。

這兩個函式都會將 INTERNET_CACHE_ENTRY_INFO 結構儲存在緩衝區中。 此結構的大小會因每個項目而異。 如果傳遞至任一函式的緩衝區大小不足,函式會失敗,GetLastError 傳回ERROR_INSUFFICIENT_BUFFER。 緩衝區大小變數包含擷取該快取專案所需的緩衝區大小。 應該按照緩衝區大小變數所指示的大小分配緩衝區,然後使用新分配的緩衝區再次呼叫該函式。

INTERNET_CACHE_ENTRY_INFO 結構包含結構大小、快取資訊的 URL、本機檔名、快取項目類型、使用計數、命中率、大小、上次修改時間、到期時間、上次存取時間、上次同步時間、標頭資訊、標頭資訊大小,以及檔案名稱延伸。

FindFirstUrlCacheEntry 函式會採用搜尋模式、儲存 INTERNET_CACHE_ENTRY_INFO 結構的緩衝區,以及緩衝區大小。 目前,只實作了傳回所有快取項目的預設搜尋模式。

列舉快取之後,應用程式應該呼叫 FindCloseUrlCache 關閉快取列舉句柄。

下列範例會在清單框中顯示每個快取專案的網址,IDC_CacheList。 它會使用 MAX_CACHE_ENTRY_INFO_SIZE 來初始化配置緩衝區,因為舊版的 WinINet API 否則無法正確列舉快取。 較新版本確實會正確列舉快取,而且沒有快取大小限制。 使用 Internet Explorer 4.0 中 WinINet API 版本在電腦上執行的所有應用程式,都必須配置所需大小的緩衝區。 如需詳細資訊,請參閱使用緩衝區

int WINAPI EnumerateCacheOld(HWND hX)
{
    DWORD dwEntrySize;
    LPINTERNET_CACHE_ENTRY_INFO lpCacheEntry;
    DWORD MAX_CACHE_ENTRY_INFO_SIZE = 4096;
    HANDLE hCacheDir;
    int nCount=0;

    SendDlgItemMessage(hX,IDC_CacheList,LB_RESETCONTENT,0,0);
    
    SetCursor(LoadCursor(NULL,IDC_WAIT));

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

again:

    hCacheDir = FindFirstUrlCacheEntry(NULL,
                                       lpCacheEntry,
                                       &dwEntrySize);
    if (!hCacheDir)                                             
    {
        delete[]lpCacheEntry;
        switch(GetLastError())
        {
            case ERROR_NO_MORE_ITEMS: 
                TCHAR tempout[80];
                _stprintf_s(tempout, 
                            80,   
                            TEXT("The number of cache entries = %d \n"),
                            nCount);
                MessageBox(hX,tempout,TEXT("Cache Enumeration"),MB_OK);
                FindCloseUrlCache(hCacheDir);
                SetCursor(LoadCursor(NULL,IDC_ARROW));
                return TRUE;
                break;
            case ERROR_INSUFFICIENT_BUFFER:
                lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) 
                                new char[dwEntrySize];
                lpCacheEntry->dwStructSize = dwEntrySize;
                goto again;
                break;
            default:
                ErrorOut( hX,GetLastError(),
                          TEXT("FindNextUrlCacheEntry Init"));
                FindCloseUrlCache(hCacheDir);
                SetCursor(LoadCursor(NULL,IDC_ARROW));
                return FALSE;
        }
    }

    SendDlgItemMessage(hX,IDC_CacheList,LB_ADDSTRING,
                       0,(LPARAM)(lpCacheEntry->lpszSourceUrlName));
    nCount++;
    delete (lpCacheEntry);

    do 
    {
        dwEntrySize = MAX_CACHE_ENTRY_INFO_SIZE;
        lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwEntrySize];
        lpCacheEntry->dwStructSize = dwEntrySize;

retry:
        if (!FindNextUrlCacheEntry(hCacheDir,
                                   lpCacheEntry, 
                                   &dwEntrySize))
        {
            delete[]lpCacheEntry;
            switch(GetLastError())
            {
                case ERROR_NO_MORE_ITEMS: 
                    TCHAR tempout[80];
                    _stprintf_s(tempout,
                                80,
                                TEXT("The number of cache entries = %d \n"),nCount);
                    MessageBox(hX,
                               tempout,
                               TEXT("Cache Enumeration"),MB_OK);
                    FindCloseUrlCache(hCacheDir);
                    return TRUE;
                    break;
                case ERROR_INSUFFICIENT_BUFFER:
                    lpCacheEntry = 
                             (LPINTERNET_CACHE_ENTRY_INFO) 
                              new char[dwEntrySize];
                    lpCacheEntry->dwStructSize = dwEntrySize;
                    goto retry;
                    break;
                default:
                    ErrorOut(hX,
                             GetLastError(),
                             TEXT("FindNextUrlCacheEntry Init"));
                    FindCloseUrlCache(hCacheDir);
                    return FALSE;
            }
        }

        SendDlgItemMessage(hX,
                           IDC_CacheList,LB_ADDSTRING,
                           0,
                          (LPARAM)(lpCacheEntry->lpszSourceUrlName));
        nCount++;
        delete[] lpCacheEntry;        
    }  while (TRUE);

    SetCursor(LoadCursor(NULL,IDC_ARROW));
    return TRUE;        
}

擷取快取條目資訊

GetUrlCacheEntryInfo 函式可讓您擷取指定 URL 的 INTERNET_CACHE_ENTRY_INFO 結構。 此結構包含結構大小、快取資訊 URL、本機檔名、快取專案類型、使用計數、命中率、大小、上次修改時間、到期、上次存取、上次同步時間、標頭資訊、標頭資訊大小,以及擴展名。

GetUrlCacheEntryInfo 接收一個 URL、一個用於 INTERNET_CACHE_ENTRY_INFO 結構的緩衝區,以及緩衝區的大小。 如果找到URL,則會將資訊複製到緩衝區。 否則,函式會失敗,GetLastError 會傳回ERROR_FILE_NOT_FOUND。 如果緩衝區大小不足以儲存快取項目資訊,函式會失敗,GetLastError 傳回ERROR_INSUFFICIENT_BUFFER。 擷取資訊所需的大小會儲存在緩衝區大小變數中。

GetUrlCacheEntryInfo 無法對 URL 進行任何剖析,因此即使包含錨點的 URL 資源已被快取,也無法在快取中找到該 URL。 例如,如果 URL “https://example.com/example.htm#sample"傳遞時,函式會傳回ERROR_FILE_NOT_FOUND,即使 “https://example.com/example.htm"位於快取中。

下列範例會取得指定 URL 的快取條目資訊。 函式接著會在 IDC_CacheDump 編輯方塊中顯示標頭資訊。

int WINAPI GetCacheEntryInfo(HWND hX,LPTSTR lpszUrl)
{
    DWORD dwEntrySize=0;
    LPINTERNET_CACHE_ENTRY_INFO lpCacheEntry;

    SetCursor(LoadCursor(NULL,IDC_WAIT));
    if (!GetUrlCacheEntryInfo(lpszUrl,NULL,&dwEntrySize))
    {
        if (GetLastError()!=ERROR_INSUFFICIENT_BUFFER)
        {
            ErrorOut(hX,GetLastError(),TEXT("GetUrlCacheEntryInfo"));
            SetCursor(LoadCursor(NULL,IDC_ARROW));
            return FALSE;
        }
        else
            lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) 
                            new char[dwEntrySize];
    }
    else
        return FALSE; // should not be successful w/ NULL buffer
                      // and 0 size

    if (!GetUrlCacheEntryInfo(lpszUrl,lpCacheEntry,&dwEntrySize))
    {
        ErrorOut(hX,GetLastError(),TEXT("GetUrlCacheEntryInfo"));
        SetCursor(LoadCursor(NULL,IDC_ARROW));
        return FALSE;
    }
    else
    {
        if ((lpCacheEntry->dwHeaderInfoSize)!=0)
        {
            LPSTR(lpCacheEntry->lpHeaderInfo)
                                [lpCacheEntry->dwHeaderInfoSize]=TEXT('\0');
            SetDlgItemText(hX,IDC_Headers,
                           lpCacheEntry->lpHeaderInfo);
        }
        else
        {
            SetDlgItemText(hX,IDC_Headers,TEXT("None"));
        }

        SetCursor(LoadCursor(NULL,IDC_ARROW));
        return TRUE;
    }
        
}

建立快取項目

應用程式會使用 CreateUrlCacheEntryCommitUrlCacheEntry 函式來建立快取項目。

CreateUrlCacheEntry 接受 URL、預期的檔案大小和擴展名。 然後,函式會建立本機檔名,以儲存對應至 URL 和檔案名稱副檔名的快取條目。

使用本機檔名,將數據寫入本機檔案中。 將資料寫入本機檔案之後,應用程式應該呼叫 CommitUrlCacheEntry

CommitUrlCacheEntry 接受 URL、本機檔案名稱、到期時間、上次修改時間、快取專案類型、標頭資訊、標頭資訊大小和副檔名。 函式接著會在快取記憶體中指定的檔案中快取數據,並將它與指定的 URL 產生關聯。

下列範例會使用先前呼叫 CreateUrlCacheEntry所建立的本機檔名,儲存在文本框 IDC_LocalFile中,將文本框 IDC_CacheDump中的文字儲存到快取項目中。 使用 fopenfprintffclose將資料寫入檔案之後,就會使用 CommitUrlCacheEntry來認可項目。

int WINAPI CommitEntry(HWND hX)
{
    LPTSTR lpszUrl, lpszExt, lpszFileName;
    LPTSTR lpszData,lpszSize;
    DWORD dwSize;
    DWORD dwEntryType=0;
    FILE *lpfCacheEntry;
    LPFILETIME lpdtmExpire, lpdtmLastModified;
    LPSYSTEMTIME lpdtmSysTime;
    errno_t err;

    if( SendDlgItemMessage(hX,IDC_RBNormal,BM_GETCHECK,0,0) )
    {
        dwEntryType = dwEntryType + NORMAL_CACHE_ENTRY;
    }
    else if( SendDlgItemMessage(hX,IDC_RBSticky, BM_GETCHECK,0,0) )
    {
        dwEntryType = dwEntryType + STICKY_CACHE_ENTRY;
    }
    else if(SendDlgItemMessage( hX,IDC_RBSparse, BM_GETCHECK,0,0) )
    {
        dwEntryType = dwEntryType + SPARSE_CACHE_ENTRY;
    }
 

    if( SendDlgItemMessage(hX,IDC_RBCookie, BM_GETCHECK,0,0))
    {
            dwEntryType = dwEntryType + COOKIE_CACHE_ENTRY;
    }
    else if( SendDlgItemMessage(hX,IDC_RBUrl, BM_GETCHECK,0,0) )
    {
        dwEntryType = dwEntryType + URLHISTORY_CACHE_ENTRY;
    }


    if( SendDlgItemMessage(hX,IDC_RBNone, BM_GETCHECK,0,0) )
    {
        dwEntryType=0;
    }
        
    lpdtmSysTime = new SYSTEMTIME;
    lpdtmExpire = new FILETIME;
    lpdtmLastModified = new FILETIME;

    GetLocalTime(lpdtmSysTime);
    SystemTimeToFileTime(lpdtmSysTime,lpdtmExpire);
    SystemTimeToFileTime(lpdtmSysTime,lpdtmLastModified);
    delete(lpdtmSysTime);

    lpszUrl = new TCHAR[MAX_PATH];
    lpszFileName = new TCHAR[MAX_PATH];
    lpszExt = new TCHAR[5];
    lpszSize = new TCHAR[10];

    GetDlgItemText(hX,IDC_SourceURL,lpszUrl,MAX_PATH);
    GetDlgItemText(hX,IDC_LocalFile,lpszFileName,MAX_PATH);
    GetDlgItemText(hX,IDC_FileExt,lpszExt,5);

    GetDlgItemText(hX,IDC_SizeLow,lpszSize,10);
    dwSize = (DWORD)_ttol(lpszSize);
    delete(lpszSize);

    if (dwSize==0)
    {
        if((MessageBox(hX,
                       TEXT("Incorrect File Size.\nUsing 8000 characters, Okay?\n"),
                       TEXT("Commit Entry"),MB_YESNO))
                        ==IDYES)
        {
            dwSize = 8000;
        }
        else
        {
            return FALSE;
        }
    }

    lpszData = new TCHAR[dwSize];
    GetDlgItemText(hX,IDC_CacheDump,lpszData,dwSize);
        
     err = _tfopen_s(&lpfCacheEntry,lpszFileName,_T("w"));
     if (err)
        return FALSE;
    fprintf(lpfCacheEntry,"%s",lpszData);
    fclose(lpfCacheEntry);
    delete(lpszData);

    if ( !CommitUrlCacheEntry( lpszUrl, 
                               lpszFileName, 
                               *lpdtmExpire,
                               *lpdtmLastModified, 
                               dwEntryType,
                               NULL,
                               0,
                               lpszExt,
                               0) )
    {
        ErrorOut(hX,GetLastError(),TEXT("Commit Cache Entry"));
        delete(lpszUrl);
        delete(lpszFileName);
        delete(lpszExt);
        delete(lpdtmExpire);
        delete(lpdtmLastModified);
        return FALSE;
    }
    else
    {
        delete(lpszUrl);
        delete(lpszFileName);
        delete(lpszExt);
        delete(lpdtmExpire);
        delete(lpdtmLastModified);
        return TRUE;
    }
}

刪除快取條目

DeleteUrlCacheEntry 函式接受一個 URL 並移除與其相關聯的快取檔案。 如果快取檔案不存在,則函式會失敗,GetLastError 會傳回ERROR_FILE_NOT_FOUND。 如果快取檔案目前已鎖定或使用中,則函式會失敗,GetLastError 會傳回ERROR_ACCESS_DENIED。 解除鎖定時會刪除檔案。

檢索快取檔案

對於需要資源檔名的應用程式,請使用 RetrieveUrlCacheEntryFileUnlockUrlCacheEntryFile 函式。 不需要檔名的應用程式應該使用 RetrieveUrlCacheEntryStreamReadUrlCacheEntryStreamUnlockUrlCacheEntryStream 函式來擷取快取中的資訊。

RetrieveUrlCacheEntryStream 不會進行任何 URL 剖析,因此即使該資源已有快取,也不會在快取中找到包含錨點的 URL。 例如,如果 URL “https://example.com/example.htm#sample"傳遞時,函式會傳回ERROR_FILE_NOT_FOUND,即使 “https://example.com/example.htm"位於快取中。

RetrieveUrlCacheEntryFile 接受 URL、儲存 INTERNET_CACHE_ENTRY_INFO 結構的緩衝區,以及緩衝區大小。 函式已被擷取並為呼叫端鎖定。

使用檔案中的資訊之後,應用程式應該呼叫 UnlockUrlCacheEntryFile 來解除鎖定檔案。

快取群組

若要建立快取群組,必須呼叫 CreateUrlCacheGroup 函式,為快取群組產生 GROUPID。 可以藉由提供快取項目的 URL 和 INTERNET_CACHE_GROUP_ADD 旗標,將條目新增至快取群組,使用 SetUrlCacheEntryGroup 函式。 若要從群組中移除快取專案,請將快取專案的 URL 和INTERNET_CACHE_GROUP_REMOVE旗標傳遞至 setUrlCacheEntryGroup

FindFirstUrlCacheEntryExFindNextUrlCacheEntryEx 函式可用來列舉指定快取群組中的項目。 列舉完成之後,函式應該呼叫 FindCloseUrlCache

處理具有可變大小資訊的結構

快取可以包含每個儲存的 URL 對應的不同大小的資訊。 這會反映在 INTERNET_CACHE_ENTRY_INFO 結構中。 當快取函式傳回此結構時,它們會建立一律為 INTERNET_CACHE_ENTRY_INFO 大小加上任何可變大小資訊的緩衝區。 如果指標成員未 NULL,它會指向結構後面的記憶體區域。 將函式傳回的緩衝區複製到另一個緩衝區時,指標成員應該固定成指向新緩衝區中適當的位置,如下列範例所示。

lpDstCEInfo->lpszSourceUrlName = 
    (LPINTERNET_CACHE_ENTRY_INFO) ((LPBYTE) lpSrcCEInfo + 
       ((DWORD)(lpOldCEInfo->lpszSourceUrlName) - (DWORD)lpOldCEInfo));

如果您指定緩衝區太小而無法包含函式所擷取的快取項目資訊,某些快取函式會失敗,並出現ERROR_INSUFFICIENT_BUFFER錯誤訊息。 在此情況下,函式也會傳回所需的緩衝區大小。 然後,您可以配置適當大小的緩衝區,然後再次呼叫 函式。

請注意

WinINet 不支援伺服器實作。 此外,不應從一項服務中使用。 針對伺服器實作或服務,請使用 Microsoft Windows HTTP 服務 (WinHTTP)