http プロトコルでは、サーバーまたはスクリプトは Cookie を使用してクライアント ワークステーション上の状態情報を維持します。 WinINet 関数では、この目的のために永続的な Cookie データベースが実装されています。 Cookie データベースから Cookie を設定したり、Cookie にアクセスしたりするために使用できます。 詳細については、「 HTTP Cookie」を参照してください。
InternetSetCookie 関数と InternetGetCookie 関数を使用して、Cookie を管理できます。
Cookie 関数の使用
次の関数を使用すると、アプリケーションは Cookie データベース内で Cookie を作成または取得できます。
機能 | 説明 |
---|---|
InternetGetCookie | 指定した URL とそのすべての親 URL の Cookie を取得します。 |
InternetSetCookie | 指定した URL に Cookie を設定します。 |
これらの関数は InternetOpen の呼び出しを必要としないことに注意してください。 有効期限が設定されている Cookie は、Users\"username"\AppData\Roaming\Microsoft\Windows\Cookies ディレクトリの下のローカル ユーザー アカウントに格納され、低い特権で実行されているアプリケーションの Users\"username"\AppData\Roaming\Microsoft\Windows\Cookies\Low ディレクトリに格納されます。 有効期限のない Cookie はメモリに格納され、作成されたプロセスでのみ使用できます。
HTTP Cookie のトピックで説明したように、InternetGetCookie 関数は、サーバーによってスクリプト化できないとマークされた Cookie を、Set-Cookie ヘッダーの "HttpOnly" 属性で返しません。
Cookie の取得
InternetGetCookie は 、指定した URL とそのすべての親 URL の Cookie を返します。
次の例では、 InternetGetCookie の呼び出しを示します。
TCHAR szURL[256]; // buffer to hold the URL
LPTSTR lpszData = NULL; // buffer to hold the cookie data
DWORD dwSize=0; // variable to get the buffer size needed
// Insert code to retrieve the URL.
retry:
// The first call to InternetGetCookie will get the required
// buffer size needed to download the cookie data.
if (!InternetGetCookie(szURL, NULL, lpszData, &dwSize))
{
// Check for an insufficient buffer error.
if (GetLastError()== ERROR_INSUFFICIENT_BUFFER)
{
// Allocate the necessary buffer.
lpszData = new TCHAR[dwSize];
// Try the call again.
goto retry;
}
else
{
// Insert error handling code.
}
}
else
{
// Insert code to display the cookie data.
// Release the memory allocated for the buffer.
delete[]lpszData;
}
Cookie の設定
InternetSetCookie は、指定した URL に Cookie を設定するために使用されます。 InternetSetCookie では 、永続的 Cookie とセッション Cookie の両方を作成できます。
永続的な Cookie には有効期限があります。 これらの Cookie は、Users\"username"\AppData\Roaming\Microsoft\Windows\Cookies ディレクトリの下のローカル ユーザー アカウントに格納され、低い特権で実行されているアプリケーションの Users\"username"\AppData\Roaming\Microsoft\Windows\Cookies\Low ディレクトリに格納されます。
セッション Cookie はメモリに格納され、それらを作成したプロセスによってのみアクセスできます。
Cookie のデータは、次の形式にする必要があります。
NAME=VALUE
有効期限の場合、形式は次の形式である必要があります。
DAY, DD-MMM-YYYY HH:MM:SS GMT
DAY は曜日の 3 文字の省略形、DD は月の日、MMM は月の 3 文字の省略形、YYYY は年、HH:MM:SS は軍事時間の時刻です。
次の例では、 InternetSetCookie の 2 つの呼び出しを示します。 最初の呼び出しではセッション Cookie が作成され、2 番目の呼び出しでは永続的な Cookie が作成されます。
BOOL bReturn;
// Create a session cookie.
bReturn = InternetSetCookie(TEXT("https://www.adventure_works.com"), NULL,
TEXT("TestData = Test"));
// Create a persistent cookie.
bReturn = InternetSetCookie(TEXT("https://www.adventure_works.com"), NULL,
TEXT("TestData = Test; expires = Sat,01-Jan-2000 00:00:00 GMT"));
Note
WinINet では、サーバーの実装はサポートされていません。 また、サービスから使用しないでください。 サーバーの実装またはサービスの場合は、 Microsoft Windows HTTP サービス (WinHTTP) を使用します。