共用方式為


快取 (Windows 網際網路)

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

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

回應處理期間的快取行為

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

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

Cache Scavenger

快取清除程式會定期清除快取中的專案。 如果專案已新增至快取,且快取已滿,則會將專案新增至快取,並排程快取攻擊。 如果快取清除器完成四捨五入的清除,而且快取尚未達到快取限制,當另一個專案新增至快取時,Scavenger 會排程為另一個回合。 一般而言,當新增的專案將快取置於其大小限制時,會排程 Scavenger。 根據預設,除非在快取控制指示詞中另有指定,否則快取中存留時間的最小時間會設定為 10 分鐘。 起始快取攻擊時,不保證最舊的專案是第一個要從快取中刪除的專案。

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

使用旗標來控制快取

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

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

意義
INTERNET_FLAG_CACHE_ASYNC 此旗標無效。
INTERNET_FLAG_CACHE_IF_NET_FAIL 如果資源的網路要求因 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_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 上有快取的複本也一樣。 只有在 HTTP 和 HTTPS 要求上 (InternetOpenUrl 函式,) 和 HttpOpenRequest 函式才會使用此旗標。
INTERNET_FLAG_RELOAD 強制函式直接從網際網路擷取所要求的資源。 下載的資訊會儲存在快取中。
INTERNET_FLAG_RESYNCHRONIZE 讓應用程式從網際網路執行資源的條件式下載。 如果儲存在快取中的版本是最新的,則會從快取下載資訊。 否則,會從伺服器重載資訊。

 

永續性快取函式

需要永續性快取服務的用戶端會使用永續性快取函式來允許其應用程式將資料儲存在本機檔案系統以供後續使用,例如在低頻寬連結限制資料存取的情況下,或完全無法使用存取。

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

使用永續性 URL 快取函式

下列永續性 URL 快取函式可讓應用程式存取及操作儲存在快取中的資訊。

函式 描述
CommitUrlCacheEntryA 快取快取儲存體中指定檔案中的資料,並將它與指定的 URL 產生關聯。
CommitUrlCacheEntryW 快取快取儲存體中指定檔案中的資料,並將它與指定的 URL 產生關聯。
CreateUrlCacheEntry 配置要求的快取儲存體,並建立本機檔案名來儲存對應至來源名稱的快取專案。
CreateUrlCacheGroup 產生快取群組識別。
DeleteUrlCacheEntry 如果檔案存在,則會從快取中移除與來源名稱相關聯的檔案。
DeleteUrlCacheGroup 釋放 GROUPID 和快取索引檔案中的任何相關聯狀態。
FindCloseUrlCache 關閉指定的列舉控制碼。
FindFirstUrlCacheEntry 開始快取的列舉。
FindFirstUrlCacheEntryEx 開始快取的篩選列舉。
FindNextUrlCacheEntry 擷取快取中的下一個專案。
FindNextUrlCacheEntryEx 擷取篩選快取列舉中的下一個專案。
GetUrlCacheEntryInfo 擷取快取專案的相關資訊。
GetUrlCacheEntryInfoEx 在轉譯 HttpSendRequest在離線模式中套用的任何快取重新導向之後搜尋 URL。
ReadUrlCacheEntryStream 從已使用 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 以關閉快取列舉控制碼。

下列範例會在清單方塊中顯示每個快取專案的 URL, 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 為 「 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 函式。 不需要檔案名的應用程式應該使用RetrieveUrlCacheEntryStream、ReadUrlCacheEntryStreamUnlockUrlCacheEntryStream函式來擷取快取中的資訊。

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 和 setUrlCacheEntryGroup 函式的 INTERNET_CACHE_GROUP_ADD 旗標,將專案新增至快取群組。 若要從群組中移除快取專案,請將快取專案的 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)