通過(guò)API訪問(wèn)IE Cache
發(fā)表時(shí)間:2024-06-21 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]我們知道在使用IE瀏覽網(wǎng)頁(yè)時(shí),IE會(huì)把遠(yuǎn)端主機(jī)的內(nèi)容保存在本機(jī)以供以后脫機(jī)訪問(wèn)。下面將介紹的是如何通過(guò)Delphi編程實(shí)現(xiàn)遍歷Cache中所有保存的內(nèi)容。 如果大家對(duì)Windows API編程比較熟悉的話,應(yīng)該知道對(duì)于遍歷訪問(wèn)一般有兩種辦法,一是定義一個(gè)回調(diào)函數(shù),然后將回調(diào)函數(shù)地址傳遞給遍歷...
我們知道在使用IE瀏覽網(wǎng)頁(yè)時(shí),IE會(huì)把遠(yuǎn)端主機(jī)的內(nèi)容保存在本機(jī)以供以后脫機(jī)訪問(wèn)。下面將介紹的是如何通過(guò)Delphi編程實(shí)現(xiàn)遍歷Cache中所有保存的內(nèi)容。
如果大家對(duì)Windows API編程比較熟悉的話,應(yīng)該知道對(duì)于遍歷訪問(wèn)一般有兩種辦法,一是定義一個(gè)回調(diào)函數(shù),然后將回調(diào)函數(shù)地址傳遞給遍歷函數(shù),當(dāng)遍歷到一個(gè)內(nèi)容時(shí)就會(huì)調(diào)用回調(diào)函數(shù)一次,例如EnumWindows函數(shù)。另外一種是先利用一個(gè)API函數(shù)建立一個(gè)局柄,然后以這個(gè)局柄作為遍歷函數(shù)的參數(shù),我們可以通過(guò)反復(fù)調(diào)用遍歷函數(shù)知道返回False,例如FindFirstFile以及FindNextFile函數(shù)。對(duì)IE Cache的遍歷使用的是第二種方法,即首先調(diào)用FindFirstUrlCacheEntryEx,如果成功返回一個(gè)局柄,然后通過(guò)重復(fù)調(diào)用FindNextUrlCacheEntryEx知道函數(shù)返回False,這樣就可以實(shí)現(xiàn)對(duì)Cache中所有文件的遍歷。
下面來(lái)看程序,建立一個(gè)新工程,然后在Form1中分別加入兩個(gè)TButton組件以及兩個(gè)TListBox組件,F(xiàn)orm1的完整代碼如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Wininet, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
ListBox2: TListBox;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
function FindNextEntrys(Handle:Integer):Boolean;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function TForm1.FindNextEntrys(Handle:Integer):Boolean;
var
T: PInternetCacheEntryInfo;
D: DWORD;
begin
D := 0;
FindnextUrlCacheEntryEx(Handle, nil, @D, nil, nil, nil);
GetMem(T, D);
try
if FindNextUrlCacheEntryEx(Handle, T, @D, nil, nil, nil) then begin
ListBox1.Items.Add(T.lpszSourceUrlName);
ListBox2.Items.Add(T.lpszLocalFileName);
Result := True;
end
else
Result := False;
finally
FreeMem(T, D)
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
H:Integer;
T: PInternetCacheEntryInfo;
D: DWORD;
begin
D := 0;
FindFirstUrlCacheEntryEx(nil, 0, NORMAL_CACHE_ENTRY, 0,nil,@D, nil, nil, nil);
GetMem(T, D);
try
H := FindFirstUrlCacheEntryEx(nil,0, NORMAL_CACHE_ENTRY, 0, T, @D, nil, nil, nil);
if (H = 0) then
else begin
repeat
until not FindNextEntrys(H);
FindCloseUrlCache(H);
end
finally
FreeMem(T, D)
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
URL:String;
begin
If ListBox1.ItemIndex >=0 then begin
URL:=ListBox1.Items.Strings[ListBox1.ItemIndex];
Self.Caption := URL;
if DeleteUrlCacheEntry(PChar(URL))then
ListBox1.Items.Delete(ListBox1.ItemIndex);
end;
end;
end.
運(yùn)行程序,點(diǎn)擊Button1,就可以分別在ListBox1中列出所有在Cache中的文件所對(duì)應(yīng)的URL以及在ListBox2中列出相應(yīng)的文件名。在ListBox1中選擇一個(gè)列表,然后點(diǎn)擊 Button2 就可以將該項(xiàng)從Cache中刪除。
下面看程序,F(xiàn)indFirstUrlCacheEntryEx函數(shù)在Delphi中定義如下:
function FindFirstUrlCacheEntryExA(lpszUrlSearchPattern: PAnsiChar;
dwFlags: DWORD;
dwFilter: DWORD;
GroupId: GROUPID;
lpFirstCacheEntryInfo: PInternetCacheEntryInfo;
lpdwFirstCacheEntryInfoBufferSize: LPDWORD;
lpGroupAttributes: Pointer; { 必須為 nil }
pcbGroupAttributes: LPDWORD; {必須為 nil }
lpReserved: Pointer { 必須為 nil }
): THandle; stdcall;
其中,dwFilter定義查找類型,在這里定義為NORMAL_CACHE_ENTRY以查找普通的Cache文件,GroupId定義查找分組,在這里定義為0以查找所有分組。lpFirstCacheEntryInfo定義Cache文件數(shù)據(jù)結(jié)構(gòu)。該結(jié)構(gòu)在Wininet.pas中有定義,這里就不列出了,其中成員lpszSourceUrlName以及l(fā)pszLocalFileName分別定義文件URL以及本地文件名。
在上面的程序中我們可以看到,不論調(diào)用FindFirstUrlCacheEntryEx還是FindNextUrlCacheEntryEx,都需要調(diào)用兩次,第一次獲得一個(gè)指向PInternetCacheEntryInfo結(jié)構(gòu)的指針,將這個(gè)指針通過(guò)GetMem函數(shù)賦予一個(gè)PInternetCacheEntryInfo結(jié)構(gòu)數(shù)據(jù)。然后第二次調(diào)用才可以獲得結(jié)果。遍歷訪問(wèn)完畢后需要調(diào)用FindCloseUrlCache方法關(guān)閉打開的局柄。
上面介紹的是Cache操作中的遍歷Cache文件以及刪除Cache文件的操作。Cache操作函數(shù)還包括:分組函數(shù),可以將特定的文件分在一個(gè)組內(nèi)并執(zhí)行組操作,例如:CreateUrlCacheGroup、SetUrlCacheEntryGroup;數(shù)據(jù)流(Stream)操作函數(shù),可以將Cache中的內(nèi)容輸入到數(shù)據(jù)流中。等等。大家可以參考MSDN中的幫助,或者到我的主頁(yè) http://www.applevb.com 同我討論以及獲得源程序。
以上程序在Win2000、Delphi 5下編寫,Win2000、Win98下運(yùn)行通過(guò)。