Недавно понадобилось удалять куки, при использовании SwinHTTP, производства Snowy (создателя сайта). Т.к. SwinHTTP работает через WinInet, это оказалось не так-то просто. Перерыл весь инет - мало чего нашел =(. Пришлось создавать небольшой модуль, который и представляю Вашему вниманию.
Модуль писался на коленке, т.к. времени было в обрез. Много лишнего, много не хватает, но думаю, кому надо - сам все поправит =).
P.S.: при вызове функции DeleteCookies, в параметры необходимо передавать хост, например для адреса http://www.delphilab.ru/index.php необходимо передавать delphilab.ru. При использовании SwinHTTP можно делать "финт ушами" =):
За всё время использования этого примера разными людьми, это первый отзыв о том, что он не рабочий.
Без фактов, что-то сомневаюсь в данном утверждении.
XP (Professional) SP2
Delphi 7.
IE 6.0.2900.2180 xpsp_sp2_gdr 070227-2254
При создании TCookieList вылетает ексцепшен:
---------------------------
Debugger Fault Notification
---------------------------
Project C:\Program Files\Borland\Delphi7\Projects\uCookies\Project1.exe faulted with message: 'access violation at 0x00405961: write of address 0x00030df4'. Process Stopped. Use Step or Run to continue.
---------------------------
OK
---------------------------
if (GetLastError = 122) then
begin
lpEntryInfo := AllocMem(dwEntrySize);
try
if (FindNextUrlCacheEntry(hHistoryDir, lpEntryInfo^, dwEntrySize)) then
if (lpEntryInfo^.CacheEntryType = (lpEntryInfo^.CacheEntryType or COOKIE_CACHE_ENTRY)) then
GetEntry(lpEntryInfo);
finally
lpEntryInfo.lpszSourceUrlName := '';
lpEntryInfo.lpszLocalFileName := '';
lpEntryInfo.lpszFileExtension := '';
freemem(lpEntryInfo);
end;
end;
until ((dwLastError = 259) or (dwLastError = 87));
end;
if (GetLastError = 122) then
begin
lpEntryInfo := AllocMem(dwEntrySize);
try
if (FindNextUrlCacheEntry(hHistoryDir, lpEntryInfo^, dwEntrySize)) then
if (lpEntryInfo^.CacheEntryType = (lpEntryInfo^.CacheEntryType or COOKIE_CACHE_ENTRY)) then
GetEntry(lpEntryInfo);
finally
lpEntryInfo.lpszSourceUrlName := '';
lpEntryInfo.lpszLocalFileName := '';
lpEntryInfo.lpszFileExtension := '';
freemem(lpEntryInfo);
end;
end;
until ((dwLastError = 259) or (dwLastError = 87));
end;
if (GetLastError = 122) then
begin
New(lpEntryInfo);
try
if (FindNextUrlCacheEntry(hHistoryDir, lpEntryInfo^, dwEntrySize)) then
if (lpEntryInfo^.CacheEntryType = (lpEntryInfo^.CacheEntryType or COOKIE_CACHE_ENTRY)) then
GetEntry(lpEntryInfo);
finally
lpEntryInfo.lpszSourceUrlName := '';
lpEntryInfo.lpszLocalFileName := '';
lpEntryInfo.lpszFileExtension := '';
Dispose(lpEntryInfo);
end;
end;
until ((dwLastError = 259) or (dwLastError = 87));
end;
procedure TCookieList.Clear;
var
lItem: PCookieItem;
begin
while List.Count > 0 do
begin
lItem := PCookieItem(List[0]);
lItem^.Name := '';
lItem^.Source := '';
Dispose(lItem);
List.Delete(0);
end;
List.Clear;
end;
constructor TCookieList.Create;
begin
List := TList.Create;
GetEntries;
end;
procedure TCookieList.Delete(const AUrl: string);
var
Idx: Integer;
lItem: PCookieItem;
src: string;
begin
src := '';
try
for Idx := 0 to List.Count - 1 do
begin
lItem := List[Idx];
if lItem^.Name = AUrl then
begin
src := lItem^.Source;
Break;
en...
if (GetLastError = 122) then
begin
New(lpEntryInfo);
try
if (FindNextUrlCacheEntry(hHistoryDir, lpEntryInfo^, dwEntrySize)) then
if (lpEntryInfo^.CacheEntryType = (lpEntryInfo^.CacheEntryType or COOKIE_CACHE_ENTRY)) then
GetEntry(lpEntryInfo);
finally
lpEntryInfo.lpszSourceUrlName := '';
lpEntryInfo.lpszLocalFileName := '';
lpEntryInfo.lpszFileExtension := '';
Dispose(lpEntryInfo);
end;
end;
until ((dwLastError = 259) or (dwLastError = 87));
end;