Delphi Internet Explorer历史记录计数
如何获取internet explorer历史记录的计数?我能用vb中的Shell.Application实现它,但不能用delphi实现。 我发现了一个带有“CLSID_CUrlHistory”的代码,它显示了所有缓存项Delphi Internet Explorer历史记录计数,delphi,internet-explorer,browser-history,Delphi,Internet Explorer,Browser History,如何获取internet explorer历史记录的计数?我能用vb中的Shell.Application实现它,但不能用delphi实现。 我发现了一个带有“CLSID_CUrlHistory”的代码,它显示了所有缓存项 我试图转换相同的,但我遗漏了一些东西,请查看下面的答案,并纠正我的错误 Procedure ListIeHistory; Const HISTORY_LIST = 34; ITEM_NAME = 0; ITEM_DATE = 2; var ShellSession
我试图转换相同的,但我遗漏了一些东西,请查看下面的答案,并纠正我的错误
Procedure ListIeHistory;
Const
HISTORY_LIST = 34;
ITEM_NAME = 0;
ITEM_DATE = 2;
var
ShellSession : OleVariant;
ShellHistory : OleVariant;
ShellEntry : OleVariant;
ShellHistoryFolder : OleVariant;
ShellCollection : OleVariant;
oEnum : IEnumvariant;
iValue : LongWord;
Begin
result:='';
ShellSession:= CreateOleObject('Shell.Application');
ShellHistory := ShellSession.Namespace(HISTORY_LIST);
ShellHistoryFolder:= ShellHistory.self;
ShellCollection := ShellHistory.Items;
oEnum := IUnknown(ShellCollection._NewEnum) as IEnumVariant;
while oEnum.Next(1, ShellEntry, iValue) = 0 do
begin
form1.Memo1.Lines.Add(vartostr(ShellEntry.Name));
end;
end;
由TLama编辑
请注意,这段代码没有错误处理(我现在很忙),所以将它作为一个灵感。但是你确定这是你想要的,我想如果你按照我的答案中的代码过滤一些项目(很可能是周期),你会得到同样的结果
这将浏览C:\Users\TLama\AppData\Local\Microsoft\Windows\History
目录,因此我认为您缺少一些历史项目(不是我;-),但我没有时间研究历史项目的来源
请注意,使用界面是正确的方法,而不是这个方法
uses
ComObj;
procedure TForm1.Button1Click(Sender: TObject);
var
URL: string;
Visited: string;
I, J, K: Integer;
Shell: OleVariant;
Item: OleVariant;
SiteFolder: OleVariant;
SiteItem: OleVariant;
PageFolder: OleVariant;
PageItem: OleVariant;
Folder: OleVariant;
const
ITEM_NAME = 0;
ITEM_DATE = 2;
HISTORY_LIST = 34;
begin
Shell := CreateOleObject('Shell.Application');
Folder := Shell.NameSpace(HISTORY_LIST);
Memo1.Lines.Add('Location: ' + Folder.Self.Path);
for I := 0 to Folder.Items.Count - 1 do
begin
Item := Folder.Items.Item(I);
Memo1.Lines.Add('Period: ' + Item.Name);
if Item.IsFolder then
begin
SiteFolder := Item.GetFolder;
for J := 0 to SiteFolder.Items.Count - 1 do
begin
SiteItem := SiteFolder.Items.Item(J);
Memo1.Lines.Add('Site: ' + SiteItem.Name);
if SiteItem.IsFolder then
begin
PageFolder := SiteItem.GetFolder;
for K := 0 to PageFolder.Items.Count - 1 do
begin
PageItem := PageFolder.Items.Item(K);
URL := PageFolder.GetDetailsOf(PageItem, ITEM_NAME);
Visited := PageFolder.GetDetailsOf(PageItem, ITEM_DATE);
Memo1.Lines.Add('URL: ' + URL + '; Visited: ' + Visited);
end;
end;
end;
end;
end;
end;
完全重写基于使用接口的建议。它似乎返回了与此更新之前的代码相同或非常相似的结果(我没有验证)
以下代码应将当前用户在Internet Explorer历史记录中的所有URL打印到备注框中,然后显示一个包含URL计数的消息框(很容易修改此代码以仅计数条目):
有趣的是,在方法的文档中没有提到必须传递给
celt
参数值1的方法,否则您将进入无限循环。有一个Url历史对象,您可以在其中查看和枚举IE历史列表。该组件与Delphi5到XE兼容。为什么要计数?这是一件复杂的事情。请解释一下您实际想做什么,我也许可以建议正确的做法。您可以使用IUrlHistoryStg::EnumUrls()枚举历史@jeffamaphone,它返回的函数似乎与findfirsturlcachentry
和findnexturlcachentry
函数相同(或非常相似)。我现在不能核实,但只要我有时间,我会检查的。是的,是的。如果没有,那会很奇怪。嗨,特拉娜,当(当我们点击查看历史时)我的vb输出给出准确的354结果时,历史内容是354。但在Delphi中,以千为单位显示所有条目。在我的系统中,它显示的不是354而是3164,请查看上面的vb代码链接,它显示的是准确的计数。帮我转换这个
uses
ComObj, ActiveX;
type
TStatURL = record
cbSize: DWORD;
pwcsUrl: LPWSTR;
pwcsTitle: LPWSTR;
ftLastVisited: FILETIME;
ftLastUpdated: FILETIME;
ftExpires: FILETIME;
dwFlags: DWORD;
end;
IEnumStatURL = interface(IUnknown)
['{3C374A42-BAE4-11CF-BF7D-00AA006946EE}']
function Next(celt: ULONG; var elt: TStatURL; var pceltFetched: ULONG): HRESULT; stdcall;
function Skip(celt: ULONG): 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: DWORD): HRESULT; stdcall;
function DeleteUrl(pocsUrl: PWideChar; dwFlags: DWORD): HRESULT; stdcall;
function QueryUrl(pocsUrl: PWideChar; dwFlags: DWORD; 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;
const
CLSID_CUrlHistory: TGUID = '{3C374A40-BAE4-11CF-BF7D-00AA006946EE}';
implementation
procedure TForm1.Button1Click(Sender: TObject);
var
I: Cardinal;
StatURL: TStatURL;
EnumStatURL: IEnumStatURL;
UrlHistoryStg: IUrlHistoryStg;
begin
Memo1.Clear;
Memo1.Lines.BeginUpdate;
try
UrlHistoryStg := CreateComObject(CLSID_CUrlHistory) as IUrlHistoryStg;
if UrlHistoryStg.EnumUrls(EnumStatURL) = S_OK then
begin
while EnumStatURL.Next(1, StatURL, I) = S_OK do
begin
if I = 1 then
Memo1.Lines.Add(StatURL.pwcsUrl);
end;
end;
finally
Memo1.Lines.EndUpdate;
end;
ShowMessage(IntToStr(Memo1.Lines.Count) + ' URLs found in history');
end;