Счетчик истории Internet Explorer

Как я могу получить количество истории Internet Explorer? Я могу добиться этого с помощью Shell.Application в vb, но не могу в delphi. Я нашел код с «CLSID_CUrlHistory», который показывает все записи кэша.


Я пытался преобразовать то же самое, но что-то упустил, пожалуйста, изучите следующий ответ и исправьте меня, где я ошибся

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, поэтому я думаю, что вы пропустили некоторые элементы истории (не я ;-), но у меня нет времени изучать, откуда берутся элементы истории.

Обратите внимание, что для использования

person Sayee Subramania    schedule 21.02.2012    source источник
comment
Пакет компонентов встроенного веб-браузера (также известный как TEmbeddedWB) содержит объект истории URL-адресов, где вы можете просмотреть и перечислите список истории IE. Компонент совместим с Delphi5 и XE.   -  person LU RD    schedule 21.02.2012
comment
Зачем тебе счет? Это сложное дело. Пожалуйста, объясните, что вы на самом деле пытаетесь сделать, и я смогу предложить правильный курс действий.   -  person i_am_jorf    schedule 21.02.2012
comment
Вы можете использовать IUrlHistoryStg::EnumUrls() для перечисления истории. msdn.microsoft.com/en-us /library/ie/aa767720(v=vs.85).aspx   -  person i_am_jorf    schedule 22.02.2012
comment
@jeffamaphone, кажется, он возвращает то же (или очень похожее), что и функции FindFirstUrlCacheEntry и FindNextUrlCacheEntry. Я не могу проверить это сейчас, но как только у меня будет время, я проверю это.   -  person TLama    schedule 22.02.2012
comment
Да, это так. Было бы странно, если бы это было не так.   -  person i_am_jorf    schedule 22.02.2012


Ответы (1)


Полная переработка на основе jeffamaphone's предложения использовать IUrlHistoryStg. Кажется, он возвращает тот же или очень похожий результат, что и код до этого обновления (я этого не проверял).

Вот код, который должен распечатать все URL-адреса в истории Internet Explorer для текущего пользователя в поле для заметок, а затем показать окно сообщения с их количеством (этот код легко изменить, чтобы подсчитывать только записи):

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;

Интересно, что никто не упомянул в документации IEnumSTATURL.Next, который вы должны передать параметру celt со значением 1, иначе вы застрянете в бесконечном цикле.

person TLama    schedule 21.02.2012
comment
Привет, TLana, содержимое истории равно 354, когда (когда мы нажимаем на историю просмотра, т.е.) мой вывод vb дает точные 354 результата. Но в Delphi, показывая все записи тысячами. В моей системе вместо 354 показывает 3164 - person Sayee Subramania; 24.02.2012
comment
gallery.technet.microsoft.com/scriptcenter/ - person Sayee Subramania; 24.02.2012
comment
Пожалуйста, просмотрите приведенную выше ссылку кода vb, она показывает точное количество. Помогите мне преобразовать это - person Sayee Subramania; 24.02.2012