Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Funkce WinINet mají jednoduchou, ale flexibilní integrovanou podporu ukládání do mezipaměti. Všechna data načtená ze sítě se ukládají do mezipaměti na pevném disku a načítají se pro následné požadavky. Aplikace může řídit ukládání do mezipaměti u každého požadavku. U požadavků HTTP ze serveru se také ukládá většina přijatých hlaviček do mezipaměti. Když je požadavek HTTP z mezipaměti splněný, vrátí se volajícímu také hlavičky uložené v mezipaměti. Díky tomu je stahování dat bezproblémové, ať už data pocházejí z mezipaměti nebo ze sítě.
Aplikace musí správně přidělit vyrovnávací paměť, aby získaly požadované výsledky při použití trvalých funkcí ukládání adres URL do mezipaměti. Další informace naleznete v tématu Použití vyrovnávacích pamětí.
Chování mezipaměti při zpracování odpovědí
Mezipaměť WinINet je kompatibilní s direktivami ŘÍZENÍ mezipaměti HTTP popsanými v dokumentu RFC 2616. Direktivy řízení mezipaměti a příznaky sady aplikací určují, co se může ukládat do mezipaměti; WinINet však na základě následujícího kritéria určuje, co se skutečně ukládá do mezipaměti:
- WinINet ukládá pouze odpovědi HTTP a FTP do mezipaměti.
- Mezipaměť může ukládat pouze odpovědi splňující požadavky a použít je v odpovědi na následnou žádost. Správné reakce jsou definovány jako ty, které se úspěšně vrátí.
- Ve výchozím nastavení bude WinINet ukládat úspěšné odpovědi do mezipaměti, pokud buď direktiva řízení mezipaměti ze serveru, nebo příznak definovaný aplikací výslovně značí, že odpověď nemusí být uložena do mezipaměti.
- Obecně platí, že odpovědi na příkaz GET se ukládají do mezipaměti, pokud jsou splněny výše uvedené požadavky. Odpovědi na příkazy PUT a POST se za žádných okolností neukládají do mezipaměti.
- Položky se uloží do mezipaměti i v případě, že je mezipaměť plná. Pokud přidaná položka způsobí překročení limitu velikosti mezipaměti, je aktivován scavenger mezipaměti. Ve výchozím nastavení není zaručeno, že položky zůstanou v mezipaměti delší než 10 minut. Další informace najdete v části Cache Scavenger níže.
- Ve výchozím nastavení se https ukládá do mezipaměti. Spravuje se globálním nastavením, které nelze přepsat direktivou mezipaměti definované aplikací. Pokud chcete přepsat globální nastavení, vyberte v ovládacích panelech aplet Možnosti internetu a přejděte na kartu Upřesnit. Zaškrtněte políčko Neukládat šifrované stránky na disk v části Zabezpečení.
Cache Scavenger
Vyhledávač neplatných položek v mezipaměti pravidelně odstraní položky z mezipaměti. Pokud je položka přidána do mezipaměti a mezipaměť je plná, je naplánován úklid mezipaměti. Pokud vyhledávač mezipaměti dokončí prohlížení mezipaměti a mezipaměť nedosáhla svého limitu, vyhledávač je naplánován na další prohlížení, jakmile je do mezipaměti přidána další položka. Obecně platí, že prohledávač je naplánován, když přidaná položka způsobí překročení velikostního limitu mezipaměti. Ve výchozím nastavení je minimální doba života v mezipaměti nastavena na 10 minut, pokud není v direktivě řízení mezipaměti uvedeno jinak. Při spuštění čističe mezipaměti neexistuje žádná záruka, že nejstarší položky budou odstraněny z mezipaměti první.
Mezipaměť se sdílí napříč všemi aplikacemi WinINet v počítači pro stejného uživatele. Od systému Windows Vista a Windows Server 2008 je velikost mezipaměti nastavena na 1/32nd velikost disku, s minimální velikostí 8 MB a maximální velikost 50 MB.
Použití flagů k řízení ukládání do mezipaměti
Příznaky ukládání do mezipaměti umožňují aplikaci řídit, kdy a jak mezipaměť používá. Tyto příznaky lze použít samostatně nebo v kombinaci s parametrem dwFlags ve funkcích, které přistupují k informacím nebo prostředkům na internetu. Ve výchozím nastavení funkce ukládají všechna data stažená z internetu.
K řízení ukládání do mezipaměti je možné použít následující příznaky.
| Hodnota | Význam |
|---|---|
| INTERNET_FLAG_CACHE_ASYNC | Tento příznak nemá žádný vliv. |
| INTERNET_FLAG_CACHE_IF_NET_FAIL | Vrátí prostředek z mezipaměti, pokud síťový požadavek na prostředek selže kvůli ERROR_INTERNET_CONNECTION_RESET nebo ERROR_INTERNET_CANNOT_CONNECT chybě. Tento příznak používá httpOpenRequest. |
| INTERNET_FLAG_DONT_CACHE | Neukládá data do mezipaměti místně ani v žádné bráně. Identické s preferovanou hodnotou INTERNET_FLAG_NO_CACHE_WRITE. |
| Označuje, že se jedná o odeslání formulářů. | |
| INTERNET_FLAG_FROM_CACHEINTERNET_FLAG_FORMS_SUBMIT | Neprovádí síťové požadavky. Všechny entity jsou vráceny z mezipaměti. Pokud požadovaná položka není v mezipaměti, vrátí se vhodná chyba, například ERROR_FILE_NOT_FOUND. Tento příznak používá pouze funkce InternetOpen. |
| INTERNET_FLAG_FWD_BACK | Označuje, že funkce by měla používat kopii prostředku, který je aktuálně v mezipaměti Internetu. Datum vypršení platnosti a další informace o prostředku se nekontrolují. Pokud požadovaná položka není v mezipaměti Internetu nalezena, systém se pokusí najít prostředek v síti. Tato hodnota byla zavedena v Microsoft Internet Exploreru 5 a je přidružena k operaci tlačítka Vpřed a Zpět v aplikaci Internet Explorer. |
| INTERNET_FLAG_HYPERLINK | Vynutí, aby aplikace znovu načetla prostředek, pokud nebyl vrácen čas vypršení platnosti a při uložení prostředku do mezipaměti nebyl vrácen čas poslední změny. |
| INTERNET_FLAG_MAKE_PERSISTENT | Už se nepodporuje. |
| INTERNET_FLAG_MUST_CACHE_REQUEST | Způsobí vytvoření dočasného souboru, pokud soubor nelze uložit do mezipaměti. To je stejné jako upřednostňovaná hodnota, INTERNET_FLAG_NEED_FILE. |
| INTERNET_FLAG_NEED_FILE | Způsobí vytvoření dočasného souboru, pokud soubor nelze uložit do mezipaměti. |
| INTERNET_FLAG_NO_CACHE_WRITE | Odmítne všechny pokusy funkce o uložení dat stažených z internetu do mezipaměti. Tento příznak je nutný, pokud aplikace nechce ukládat žádné stažené zdroje na místní úložiště. |
| INTERNET_FLAG_NO_UI | Zakáže dialogové okno cookie. Tento příznak může používat httpOpenRequest a InternetOpenUrl (pouze požadavky HTTP). |
| INTERNET_FLAG_OFFLINE | Zabrání aplikaci v odesílání požadavků do sítě. Všechny požadavky jsou vyřešeny pomocí prostředků uložených v mezipaměti. Pokud zdroj není v mezipaměti, vrátí se vhodná chyba, například ERROR_FILE_NOT_FOUND. |
| INTERNET_FLAG_PRAGMA_NOCACHE | Vynutí, aby byl požadavek vyřešen serverem původu, i když na proxy serveru existuje kopie uložená v mezipaměti. Funkce InternetOpenUrl (pouze v požadavcích HTTP a HTTPS) a funkci HttpOpenRequest tento příznak používají. |
| INTERNET_FLAG_RELOAD | Funkce donutí načíst požadovaný prostředek přímo z Internetu. Informace, které se stáhnou, jsou uloženy v mezipaměti. |
| INTERNET_FLAG_RESYNCHRONIZE | Způsobí, že aplikace provede podmíněné stažení prostředku z internetu. Pokud je verze uložená v mezipaměti aktuální, informace se stáhnou z mezipaměti. Jinak se informace znovu načtou ze serveru. |
Trvalé funkce ukládání do mezipaměti
Klienti, kteří potřebují trvalé služby ukládání do mezipaměti, používají trvalé funkce ukládání do mezipaměti, aby jejich aplikace mohly ukládat data do místního systému souborů pro následné použití, například v situacích, kdy připojení s nízkou šířkou pásma omezuje přístup k datům nebo přístup vůbec není k dispozici.
Funkce mezipaměti poskytují trvalé ukládání do mezipaměti a offline procházení. Pokud příznak INTERNET_FLAG_NO_CACHE_WRITE explicitně neuvádí ukládání do mezipaměti, funkce ukládají všechna data stažená ze sítě do mezipaměti. Odpovědi na data POST se neukládají do mezipaměti.
Použití funkcí mezipaměti trvalých adres URL
Následující funkce mezipaměti trvalých adres URL umožňují aplikaci přistupovat k informacím uloženým v mezipaměti a manipulovat s nimi.
| Funkce | Popis |
|---|---|
| CommitUrlCacheEntryA | Ukládá data do mezipaměti v zadaném souboru v úložišti mezipaměti a přidruží je k dané adrese URL. |
| CommitUrlCacheEntryW | Ukládá data do mezipaměti v zadaném souboru v úložišti mezipaměti a přidruží je k dané adrese URL. |
| CreateUrlCacheEntry | Přidělí požadované úložiště mezipaměti a vytvoří název místního souboru pro uložení položky mezipaměti, která odpovídá názvu zdroje. |
| CreateUrlCacheGroup | Vygeneruje identifikaci skupiny mezipaměti. |
| DeleteUrlCacheEntry | Odebere soubor přidružený ke zdrojovému názvu z mezipaměti, pokud soubor existuje. |
| DeleteUrlCacheGroup | Uvolní GROUPID a všechny přidružené stavy v souboru indexu mezipaměti. |
| FindCloseUrlCache | Zavře zadaný popisovač výčtu. |
| FindFirstUrlCacheEntry | Zahájí výčet mezipaměti. |
| FindFirstUrlCacheEntryEx | Začne filtrovaný výčet mezipaměti. |
| FindNextUrlCacheEntry | Načte další položku v mezipaměti. |
| FindNextUrlCacheEntryEx | Načte další položku ve výčtu filtrované mezipaměti. |
| GetUrlCacheEntryInfo | Načte informace o položce mezipaměti. |
| GetUrlCacheEntryInfoEx | Vyhledá adresu URL poté, co jsou přeložena všechna přesměrování uložená v mezipaměti, která by se použila v offline režimu pomocí HttpSendRequest. |
| ReadUrlCacheEntryStream | Načte data uložená v mezipaměti z datového proudu, který byl otevřen pomocí RetrieveUrlCacheEntryStream. |
| RetrieveUrlCacheEntryFile | Načte položku mezipaměti z mezipaměti ve formě souboru. |
| RetrieveUrlCacheEntryStream | Poskytuje nejúčinnější a na implementaci nezávislý způsob přístupu k datům mezipaměti. |
| SetUrlCacheEntryGroup | Přidá nebo odebere položky ze skupiny mezipaměti. |
| SetUrlCacheEntryInfo | Nastaví zadané členy struktury INTERNET_CACHE_ENTRY_INFO. |
| UnlockUrlCacheEntryFile | Odemkne mezipaměťovou položku, která byla zamknuta při načtení souboru pro použití z mezipaměti pomocí RetrieveUrlCacheEntryFile. |
| UnlockUrlCacheEntryStream | Zavře datový proud, který byl načten pomocí RetrieveUrlCacheEntryStream. |
Vyjmenování mezipaměti
Funkce FindFirstUrlCacheEntry a FindNextUrlCacheEntry vytvoří výčet informací uložených v mezipaměti. FindFirstUrlCacheEntry spustí výčet tak, že vezme hledací vzor, vyrovnávací paměť a velikost vyrovnávací paměti k vytvoření popisovače a vrátí první položku mezipaměti. FindNextUrlCacheEntry vezme popisovač vytvořený FindFirstUrlCacheEntry, vyrovnávací paměť a velikost vyrovnávací paměti pro vrácení další položky mezipaměti.
Obě funkce ukládají strukturu INTERNET_CACHE_ENTRY_INFO do vyrovnávací paměti. Velikost této struktury se pro každou položku liší. Pokud velikost vyrovnávací paměti předaná některé funkci není dostatečná, funkce selže a GetLastError vrátí ERROR_INSUFFICIENT_BUFFER. Proměnná velikosti vyrovnávací paměti obsahuje velikost vyrovnávací paměti potřebnou k načtení této položky mezipaměti. Měla by být přidělena vyrovnávací paměť o velikosti, kterou určuje proměnná velikosti vyrovnávací paměti, a poté by měla být funkce znovu zavolána s novou vyrovnávací pamětí.
Struktura INTERNET_CACHE_ENTRY_INFO obsahuje velikost struktury, adresu URL informací uložených v mezipaměti, název místního souboru, typ položky mezipaměti, počet použití, rychlost dosažení, velikost, čas poslední změny, vypršení platnosti, poslední přístup, čas poslední synchronizace, informace o hlavičce, velikost informací o hlavičce a příponu názvu souboru.
Funkce FindFirstUrlCacheEntry přebírá vzor hledání, vyrovnávací paměť, která ukládá strukturu INTERNET_CACHE_ENTRY_INFO a velikost vyrovnávací paměti. V současné době se implementuje pouze výchozí vzor hledání, který vrací všechny položky mezipaměti.
Po vytvoření výčtu mezipaměti by aplikace měla volat FindCloseUrlCache, aby uzavřela popisovač výčtu mezipaměti.
Následující příklad zobrazí adresu URL každé položky mezipaměti v seznamu IDC_CacheList. Používá MAX_CACHE_ENTRY_INFO_SIZE k počátečnímu přidělení vyrovnávací paměti, protože dřívější verze rozhraní API WinINet nevyčtou mezipaměť správně jinak. Novější verze správně vyčíslí mezipaměť a neexistuje žádný limit velikosti mezipaměti. Všechny aplikace, které běží na počítačích s verzí rozhraní WinINet API z aplikace Internet Explorer 4.0, musí přidělit vyrovnávací paměť požadované velikosti. Další informace naleznete v tématu Použití vyrovnávacích pamětí.
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;
}
Načítání informací o položce mezipaměti
Funkce GetUrlCacheEntryInfo umožňuje načíst strukturu INTERNET_CACHE_ENTRY_INFO pro zadanou adresu URL. Tato struktura obsahuje velikost struktury, adresu URL informací uložených v mezipaměti, název místního souboru, typ položky mezipaměti, počet použití, rychlost přístupu, velikost, čas poslední změny, vypršení platnosti, poslední přístup, čas poslední synchronizace, informace o hlavičce, velikost informací o hlavičce a příponu názvu souboru.
GetUrlCacheEntryInfo akceptuje adresu URL, vyrovnávací paměť pro strukturu INTERNET_CACHE_ENTRY_INFO a velikost vyrovnávací paměti. Pokud se adresa URL najde, informace se zkopírují do vyrovnávací paměti. V opačném případě funkce selže a GetLastError vrátí ERROR_FILE_NOT_FOUND. Pokud velikost vyrovnávací paměti nestačí k uložení informací o položce mezipaměti, funkce selže a GetLastError vrátí ERROR_INSUFFICIENT_BUFFER. Velikost potřebná k načtení informací je uložena v proměnné velikosti vyrovnávací paměti.
GetUrlCacheEntryInfo neprovádí analýzu žádné adresy URL, takže adresa URL obsahující ukotvení (#) se v mezipaměti nenajde, i když je prostředek uložen v mezipaměti. Například pokud je adresa URL "https://example.com/example.htm#sample"" předána, funkce vrátí ERROR_FILE_NOT_FOUND, i když "https://example.com/example.htm"" je v mezipaměti.
Následující příklad načte informace o položce mezipaměti pro zadanou adresu URL. Funkce poté zobrazí informace záhlaví v editačním poli 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;
}
}
Vytvoření položky mezipaměti
Aplikace používá CreateUrlCacheEntry a CommitUrlCacheEntry funkce k vytvoření položky mezipaměti.
CreateUrlCacheEntry přijímá adresu URL, očekávanou velikost souboru a příponu názvu souboru. Funkce pak vytvoří název místního souboru pro uložení položky mezipaměti, která odpovídá adrese URL a příponě názvu souboru.
Pomocí názvu místního souboru zapište data do místního souboru. Po zápisu dat do místního souboru by aplikace měla volat CommitUrlCacheEntry.
CommitUrlCacheEntry přijímá adresu URL, název místního souboru, vypršení platnosti, čas poslední změny, typ položky mezipaměti, informace o hlavičce, velikost informací o hlavičce a příponu názvu souboru. Funkce pak uloží data do mezipaměti v souboru zadaném v úložišti mezipaměti a přidruží je k dané adrese URL.
Následující příklad používá název místního souboru vytvořený předchozím voláním CreateUrlCacheEntry, uložené v textovém poli, IDC_LocalFile, k uložení textu z textového pole IDC_CacheDumpv položce mezipaměti. Po zápisu dat do souboru pomocí fopen, fprintfa fclose, položka se potvrdí pomocí 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;
}
}
Odstranění položky mezipaměti
Funkce DeleteUrlCacheEntry přebírá adresu URL a odebere soubor mezipaměti přidružený k ní. Pokud soubor mezipaměti neexistuje, funkce selže a GetLastError vrátí ERROR_FILE_NOT_FOUND. Pokud je soubor mezipaměti aktuálně uzamčen nebo používán, funkce selže a GetLastError vrátí ERROR_ACCESS_DENIED. Soubor se odstraní při odemknutí.
Načítání vstupních souborů mezipaměti
Pro aplikace, které vyžadují název souboru prostředku, použijte funkce RetrieveUrlCacheEntryFile a UnlockUrlCacheEntryFile. Aplikace, které nevyžadují název souboru, by měly použít RetrieveUrlCacheEntryStream, ReadUrlCacheEntryStreama UnlockUrlCacheEntryStream funkce načtení informací v mezipaměti.
RetrieveUrlCacheEntryStream neprovádí analýzu adresy URL, takže adresa URL obsahující ukotvení (#) se v mezipaměti nenajde, i když je prostředek uložen v mezipaměti. Například pokud je adresa URL "https://example.com/example.htm#sample" předána funkci, funkce vrátí ERROR_FILE_NOT_FOUND, i když je "https://example.com/example.htm" v mezipaměti.
RetrieveUrlCacheEntryFile přijímá adresu URL, vyrovnávací paměť která ukládá strukturu INTERNET_CACHE_ENTRY_INFO a velikost vyrovnávací paměti. Funkce je načtena a uzamčena pro volajícího.
Po použití informací v souboru by aplikace měla volat UnlockUrlCacheEntryFile, aby soubor odemkla.
Skupiny mezipaměti
Chcete-li vytvořit skupinu mezipaměti, musí být volána funkce CreateUrlCacheGroup k vygenerování GROUPID pro skupinu mezipaměti. Položky lze do skupiny mezipaměti přidat tak, že funkci SetUrlCacheEntryGroup poskytnete adresu URL položky mezipaměti a příznak INTERNET_CACHE_GROUP_ADD. Pokud chcete odebrat položku mezipaměti ze skupiny, předejte adresu URL položky mezipaměti a příznak INTERNET_CACHE_GROUP_REMOVE do SetUrlCacheEntryGroup.
Funkce FindFirstUrlCacheEntryEx a FindNextUrlCacheEntryEx lze použít k vytvoření výčtu položek v zadané skupině mezipaměti. Po dokončení výčtu by funkce měla volat FindCloseUrlCache.
Zpracování struktur s informacemi o velikosti proměnné
Mezipaměť může obsahovat informace o velikosti proměnné pro každou uloženou adresu URL. To se odráží ve struktuře INTERNET_CACHE_ENTRY_INFO. Když funkce mezipaměti vrátí tuto strukturu, vytvoří vyrovnávací paměť, která má vždy velikost INTERNET_CACHE_ENTRY_INFO a jakékoli informace proměnné velikosti. Pokud není člen ukazatele null, odkazuje na oblast paměti bezprostředně za strukturou. Při kopírování vyrovnávací paměti vrácené funkcí do jiné vyrovnávací paměti je potřeba upravit členy ukazatele tak, aby ukazovaly na příslušné místo v nové vyrovnávací paměti, jak ukazuje následující příklad.
lpDstCEInfo->lpszSourceUrlName =
(LPINTERNET_CACHE_ENTRY_INFO) ((LPBYTE) lpSrcCEInfo +
((DWORD)(lpOldCEInfo->lpszSourceUrlName) - (DWORD)lpOldCEInfo));
Některé funkce mezipaměti selžou s chybovou zprávou ERROR_INSUFFICIENT_BUFFER, pokud zadáte buffer, který je příliš malý, aby obsahoval informace o položce mezipaměti načtené funkcí. V tomto případě vrátí funkce také požadovanou velikost vyrovnávací paměti. Pak můžete přidělit vyrovnávací paměť odpovídající velikosti a znovu volat funkci.
Poznámka
WinINet nepodporuje implementace serveru. Kromě toho by se to nemělo používat v rámci služby. Pro implementace serverů nebo služby použijte microsoft Windows HTTP Services (WinHTTP).