線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1482
推到 Plurk!
推到 Facebook!

通過API訪問IE Cache

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-26 03:09:01 IP:210.65.xxx.xxx 未訂閱
此為轉貼資料 通過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
系統時間:2024-04-20 12:16:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!