明天出发去西雅图参加微软全球最有价值专家年会了,暂停更新一段时间。
在你调用IUrlHistoryStg::DeleteUrl 之后, 这个URL项目仍旧会出现在IE历史纪录目录中。 你可以使用IContextMenu::InvokeCommand模拟一个手动删除命令,但是这样做的缺点是你不能够跳过删除确认对话框
下面的代码删除一个IE历史纪录目录中顶层目录的第一项。这通常是最久的历史纪录,但是你可以修改部分代码来删除需要的项目。
[pre]
// Error checking minimized for clarity.
void DeleteUrlFromHistoryShell()
{
 HRESULT hr;
 // Call this if needed.
 CoInitialize( NULL );
 
 IShellFolder* pDesktopFolder = NULL;
 IMalloc* pMalloc = NULL;
 hr = ::SHGetMalloc(&pMalloc);
 // Get desktop folder.
 hr = ::SHGetDesktopFolder(&pDesktopFolder);
 // Get the history folder.
 ITEMIDLIST* pidlHistoryFolder = NULL;
 hr = ::SHGetSpecialFolderLocation(NULL, CSIDL_HISTORY, &pidlHistoryFolder);
 // Get the IShellFolder of the history folder.
 IShellFolder* pHistoryFolder = NULL;
 hr = pDesktopFolder->BindToObject(pidlHistoryFolder, NULL, IID_IShellFolder, (void**)&pHistoryFolder);
 // Enumerate the history items.
 IEnumIDList* pHistoryEnum = NULL;
 hr = pHistoryFolder->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &pHistoryEnum);
 ITEMIDLIST* pidl = NULL;
 ULONG fetched = 0;
 hr = pHistoryEnum->Next(1, &pidl, &fetched);
 if (SUCCEEDED(hr))
 {
  const ITEMIDLIST* pidl2 = pidl;
  // Get the IContextMenu interface.
  IContextMenu* pContextMenu = NULL;
  hr = pHistoryFolder->GetUIObjectOf(NULL, 1, &pidl2, IID_IContextMenu, NULL, (void**)&pContextMenu);
  if (SUCCEEDED(hr))
  {
   CMINVOKECOMMANDINFO pCommandInfo = { 0 };
   pCommandInfo.cbSize = sizeof(CMINVOKECOMMANDINFO);
   pCommandInfo.lpVerb = _T("delete");
   pCommandInfo.fMask = CMIC_MASK_FLAG_NO_UI; // has no effect
   hr = pContextMenu->InvokeCommand(&pCommandInfo);
  }
  pContextMenu->Release();
 }
 pHistoryEnum->Release();
 pHistoryFolder->Release();
 pMalloc->Release();
 pDesktopFolder->Release();
}
[/pre]
IUrlHistoryStg2::ClearHistory从IE历史纪录目录清除一已经被删除的URL项目。IUrlHistoryStg::DeleteUrl并非设计来用于删除历史记录中的URL项目,而是删除某个index.dat中的项目。因为很多内部函数依赖于它,所以它的行为不能被改变。同一时间内,保存历史记录的index.dat可能有多个。
No comments:
Post a Comment