通過API訪問IE Cache |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
此為轉貼資料 通過API訪問IE Cache technofantasy(原作)
IE Cache 暫存檔案 Delphi
通過API訪問IE Cache
我們知道在使用IE瀏覽網頁時,IE會把遠端主機的內容保存在本機以供以後脫機訪問。下面將介紹的是如何通過Delphi編程實現遍曆Cache中所有保存的內容。
如果大家對Windows API編程比較熟悉的話,應該知道對於遍曆訪問一般有兩種辦法,一是定義一個回調函數,然後將回調函數位址傳遞給遍曆函數,當遍曆到一個內容時就會調用回調函數一次,例如EnumWindows函數。另外一種是先利用一個API函數建立一個局柄,然後以這個局柄作?遍曆函數的參數,我們可以通過反復調用遍曆函數知道返回False,例如FindFirstFile以及FindNextFile函數。對IE Cache的遍曆使用的是第二種方法,即首先調用FindFirstUrlCacheEntryEx,如果成功返回一個局柄,然後通過重復調用FindNextUrlCacheEntryEx知道函數返回False,這樣就可以實現對Cache中所有文件的遍曆。
下面來看程式,建立一個新工程,然後在Form1中分別加入兩個TButton元件以及兩個TListBox元件,Form1的完整代碼如下:
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.
運行程式,點擊Button1,就可以分別在ListBox1中列出所有在Cache中的文件所對應的URL以及在ListBox2中列出相應的檔案名。在ListBox1中選擇一個列表,然後點擊 Button2 就可以將該項從Cache中刪除。
下面看程式,FindFirstUrlCacheEntryEx函數在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文件資料結構。該結構在Wininet.pas中有定義,這裏就不列出了,其中成員lpszSourceUrlName以及lpszLocalFileName分別定義文件URL以及本地檔案名。
在上面的程式中我們可以看到,不論調用FindFirstUrlCacheEntryEx還是FindNextUrlCacheEntryEx,都需要調用兩次,第一次獲得一個指向PInternetCacheEntryInfo結構的指標,將這個指標通過GetMem函數賦予一個PInternetCacheEntryInfo結構資料。然後第二次調用才可以獲得結果。遍曆訪問完畢後需要調用FindCloseUrlCache方法關閉打開的局柄。
上面介紹的是Cache操作中的遍曆Cache文件以及刪除Cache文件的操作。Cache操作函數還包括:分組函數,可以將特定的文件分在一個組內並執行組操作,例如:CreateUrlCacheGroup、SetUrlCacheEntryGroup;資料流程(Stream)操作函數,可以將Cache中的內容輸入到資料流程中。等等。大家可以參考MSDN中的幫助,或者到我的主頁 http://www.applevb.com 同我討論以及獲得根源程式。
以上程式在Win2000、Delphi 5下編寫,Win2000、Win98下運行通過。
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |