delphi 缓存图片查看器

2018-10-30


{$WARNINGS OFF}

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ActiveX, Menus, ComCtrls, Buttons;

type
TForm1 = class(TForm)
   Panel3: TPanel;
   ListBox1: TListBox;
   sbA: TScrollBox;
   Image1: TImage;
   Panel1: TPanel;
   Panel2: TPanel;
   SpeedButton1: TSpeedButton;
   SpeedButton2: TSpeedButton;
   PopupMenu1: TPopupMenu;
   Cookies1: TMenuItem;
   N1: TMenuItem;
   N3: TMenuItem;
   N4: TMenuItem;
   N5: TMenuItem;
   N6: TMenuItem;
   JPG1: TMenuItem;
   BMP1: TMenuItem;
   GIF1: TMenuItem;
   N2: TMenuItem;
   N7: TMenuItem;
   N8: TMenuItem;
   N9: TMenuItem;
   N10: TMenuItem;
   N11: TMenuItem;
   N12: TMenuItem;
   N13: TMenuItem;

   procedure ListBox1Click(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure SpeedButton1Click(Sender: TObject);
   procedure SpeedButton2Click(Sender: TObject);
   procedure FormResize(Sender: TObject);
   procedure FormShow(Sender: TObject);
   procedure Cookies1Click(Sender: TObject);
   procedure N1Click(Sender: TObject);
   procedure N13Click(Sender: TObject);
private
   procedure GetInternetCacheFiles(AList: TStringList);
   procedure DeleteInternetCacheFiles;
   procedure DisposeListBoxObject;
   procedure BList(Sender: TObject);
public
   end;

type
TSTATURL = record
   cbSize: DWORD;
   pwcsUrl: DWORD;
   pwcsTitle: DWORD;
   ftLastVisited: FILETIME;
   ftLastUpdated: FILETIME;
   ftExpires: FILETIME;
   dwFlags: DWORD;
end;

IEnumSTATURL = interface(IUnknown)
   ['{3C374A42-BAE4-11CF-BF7D-00AA006946EE}']
   function Next(celt: Integer; out elt; pceltFetched: PLongint): HRESULT; stdcall;
   function Skip(celt: Longint): HRESULT; stdcall;
   function Reset: HResult; stdcall;
   function Clone(out ppenum: IEnumSTATURL): HResult; stdcall;
   function SetFilter(poszFilter: PWideChar; dwFlags: DWORD): HResult; stdcall;
end;

IUrlHistoryStg = interface(IUnknown)
   ['{3C374A41-BAE4-11CF-BF7D-00AA006946EE}']
   function AddUrl(pocsUrl: PWideChar; pocsTitle: PWideChar;
   dwFlags: Integer): HResult; stdcall;
   function DeleteUrl(pocsUrl: PWideChar;
   dwFlags: Integer): HResult; stdcall;
   function QueryUrl(pocsUrl: PWideChar; dwFlags: Integer;
   var lpSTATURL: TSTATURL): HResult; stdcall;
   function BindToObject(pocsUrl: PWideChar; var riid: TIID;
   out ppvOut: Pointer): HResult; stdcall;
   function EnumUrls(out ppenum: IEnumSTATURL): HResult; stdcall;
end;

IUrlHistoryStg2 = interface(IUrlHistoryStg)
   ['{AFA0DC11-C313-11D0-831A-00C04FD5AE38}']
   function AddUrlAndNotify(pocsUrl: PWideChar; pocsTitle: PWideChar;
   dwFlags: Integer; fWriteHistory: Integer; var poctNotify: Pointer;
   const punkISFolder: IUnknown): HResult; stdcall;
   function ClearHistory: HResult; stdcall;
end;

var
Form1: TForm1;

implementation

uses jpeg, ComObj, WinInet, HTTPApp;

{$R *.dfm}

procedure ClearInternetExplorerHistroy;
const CLSID_CUrlHistory: TGUID = '{3C374A40-BAE4-11CF-BF7D-00AA006946EE}';
var
stg: IUrlHistoryStg2;
begin
stg := CreateComObject(CLSID_CUrlHistory) as IUrlHistoryStg2;
stg.ClearHistory;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
DisposeListBoxObject;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
var
AFilePath: string;
jpg: TJpegImage;
begin
if ListBox1.Items.Count = 0 then exit;

Caption := format('IE缓存图片查看器 [%d/%d]', [listbox1.itemindex + 1, listbox1.Count]);
AFilePath := PString(ListBox1.Items.Objects[ListBox1.ItemIndex])^;
Image1.Picture.Assign(nil);
Jpg := TJpegImage.Create;
Jpg.LoadFromFile(AFilePath);

sbA.HorzScrollBar.Position := jpg.Width; //
sbA.VertScrollBar.Position := jpg.Height;
Image1.Width := jpg.Width; //
Image1.Height := jpg.Height;
Image1.Top := (sba.height - jpg.Height) div 2;
Image1.Left := (sba.width - jpg.Width) div 2;
Image1.Picture.Assign(jpg);
jpg.free;
end;

procedure TForm1.DisposeListBoxObject;
var
i: integer;
begin
for i := 0 to ListBox1.Items.Count - 1 do begin
   Dispose(PString(ListBox1.Items.Objects[i]));
end;
end;

procedure TForm1.GetInternetCacheFiles(AList: TStringList);
var
lpEntryInfo: PInternetCacheEntryInfo;
hCacheDir: LongWord;
dwEntrySize: LongWord;
dwLastError: LongWord;
begin
AList.Clear;
dwEntrySize := 0;
FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize);
GetMem(lpEntryInfo, dwEntrySize);
hCacheDir := FindFirstUrlCacheEntry(nil, lpEntryInfo^, dwEntrySize);
if hCacheDir <> 0 then begin
  // lpEntryInfo^.LastModifiedTime
   AList.Add(string(lpEntryInfo^.lpszLocalFileName));
   FreeMem(lpEntryInfo);
   repeat
   dwEntrySize := 0;
   FindNextUrlCacheEntry(hCacheDir, TInternetCacheEntryInfo(nil^), dwEntrySize);
   dwLastError := GetLastError();
   if GetLastError = ERROR_INSUFFICIENT_BUFFER then begin
   GetMem(lpEntryInfo, dwEntrySize);
   if FindNextUrlCacheEntry(hCacheDir, lpEntryInfo^, dwEntrySize) then begin
   AList.Add(string(lpEntryInfo^.lpszLocalFileName));
   end;
   FreeMem(lpEntryInfo);
   end;
   until dwLastError = ERROR_NO_MORE_ITEMS;
end else begin
   FreeMem(lpEntryInfo);
end;
end;

procedure TForm1.DeleteInternetCacheFiles;
var
lpEntryInfo: PInternetCacheEntryInfo;
hCacheDir: LongWord;
dwEntrySize: LongWord;
dwLastError: LongWord;
begin
dwEntrySize := 0;
FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize);
GetMem(lpEntryInfo, dwEntrySize);
hCacheDir := FindFirstUrlCacheEntry(nil, lpEntryInfo^, dwEntrySize);
if hCacheDir <> 0 then begin
   if (lpEntryInfo^.CacheEntryType and COOKIE_CACHE_ENTRY) = 0 then begin
   DeleteUrlCacheEntry(lpEntryInfo^.lpszSourceUrlName);
   end;
   FreeMem(lpEntryInfo);

   repeat
   dwEntrySize := 0;
   FindNextUrlCacheEntry(hCacheDir, TInternetCacheEntryInfo(nil^), dwEntrySize);
   dwLastError := GetLastError();
   if GetLastError = ERROR_INSUFFICIENT_BUFFER then begin
   GetMem(lpEntryInfo, dwEntrySize);
   if FindNextUrlCacheEntry(hCacheDir, lpEntryInfo^, dwEntrySize) then begin
   if (lpEntryInfo^.CacheEntryType and COOKIE_CACHE_ENTRY) = 0 then begin
   DeleteUrlCacheEntry(lpEntryInfo^.lpszSourceUrlName);
   end;
   end;
   FreeMem(lpEntryInfo);
   end;
   until dwLastError = ERROR_NO_MORE_ITEMS;
end else begin
   FreeMem(lpEntryInfo);
end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if listbox1.ItemIndex < 1 then exit;
listbox1.ItemIndex := listbox1.ItemIndex - 1;
ListBox1Click(Sender);

end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin

if listbox1.ItemIndex = listbox1.items.count then exit;
listbox1.ItemIndex := listbox1.ItemIndex + 1;
ListBox1Click(Sender);
end;

procedure TForm1.BList(Sender: TObject);
var
APathList: TStringList;
AFileName: string;
i: Integer;
begin
if ListBox1.Items.Count = 0 then DisposeListBoxObject;
ListBox1.Items.Clear;
APathList := TStringList.Create;
try
   GetInternetCacheFiles(APathList);
   with ListBox1.Items do begin
   BeginUpdate;
   for i := 0 to APathList.Count - 1 do begin
   AFileName := UnixPathToDosPath(APathList[i]);
   if ExtractFileExt(AFileName) = '.jpg' then begin
   AddObject(ExtractFileName(AFileName), TObject(NewStr(AFileName)));
   end;
   end;
   EndUpdate;
   // Caption := format('IE缓存图片查看器 [%d/%d]', [listbox1.itemindex+1, listbox1.Count]);
   end;
finally
   FreeAndNil(APathList);
end;
listbox1.itemindex := 0;
ListBox1Click(Sender);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
panel2.Top := 0;
panel2.Left := panel1.width div 2 - panel2.Width div 2;
Image1.Top := (sba.height - Image1.Height) div 2;
Image1.Left := (sba.width - Image1.Width) div 2;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
BList(Sender);
end;

procedure TForm1.Cookies1Click(Sender: TObject);
begin
DeleteInternetCacheFiles;
end;

procedure TForm1.N1Click(Sender: TObject);
begin
ClearInternetExplorerHistroy;
end;

procedure TForm1.N13Click(Sender: TObject);
begin
if listbox1.Width = 0 then
begin
   listbox1.Width := 200 ;
   N13.Checked := true;
end else
begin
   listbox1.Width := 0;
   N13.Checked := false;
end;
Image1.Top := (sba.height - Image1.Height) div 2;
Image1.Left := (sba.width - Image1.Width) div 2;
end;

end.


阅读35