// 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();
}

解决方案 »

  1.   

    郁闷哦。我会DELPHI但是才开始学VC,哎,爱慕能助啊!!!
      

  2.   

    procedure DeleteUrlFromHistoryShell;
    var
    hr:HRESULT;
             pDesktopFolder:^IShellFolder; 
    pMalloc:^IMalloc;
             pidlHistoryFolder:^ITEMIDLIST;
    pHistoryFolder:^IShellFolder;  
    pHistoryEnum:^IEnumIDList; 
    pidl:^ITEMIDLIST; 
    fetched:ULONG;
    pidl2:^ITEMIDLIST;
    pContextMenu:^IContextMenu;
    pCommandInfo:CMINVOKECOMMANDINFO; 
    begin
    // Call this if needed.
    CoInitialize( Null ); pDesktopFolder := Null;
    pMalloc := Null; hr := SHGetMalloc(@pMalloc); // Get desktop folder.
    hr := SHGetDesktopFolder(@pDesktopFolder); // Get the history folder.
    pidlHistoryFolder := Null;
    hr := SHGetSpecialFolderLocation(Null, CSIDL_HISTORY, @pidlHistoryFolder); // Get the IShellFolder of the history folder.
    pHistoryFolder := Null;
    hr := pDesktopFolder.BindToObject(pidlHistoryFolder, Null, IID_IShellFolder, @pHistoryFolder); // Enumerate the history items.
    pHistoryEnum := NULL;
    hr := pHistoryFolder.EnumObjects(Null, SHCONTF_FOLDERS and SHCONTF_NONFOLDERS, @pHistoryEnum); pidl := Null;
    fetched := 0; hr := pHistoryEnum.Next(1, @pidl, @fetched); if (SUCCEEDED(hr)) then
    begin
    pidl2 := pidl; // Get the IContextMenu interface.
    pContextMenu := Null;
    hr := pHistoryFolder.GetUIObjectOf(Null, 1, @pidl2, IID_IContextMenu, Null, @pContextMenu); if (SUCCEEDED(hr)) then
    begin
    pCommandInfo := nil; pCommandInfo.cbSize := sizeof(CMINVOKECOMMANDINFO);
    pCommandInfo.lpVerb := 'delete';
    pCommandInfo.fMask := CMIC_MASK_FLAG_NO_UI; // has no effect
    hr := pContextMenu.InvokeCommand(@pCommandInfo);
    end; pContextMenu._Release;
    end; pHistoryEnum._Release;
    pHistoryFolder._Release;
    pMalloc._Release;
    pDesktopFolder._Release;
    end;
      

  3.   

    你直接说什么功能吧,为什么一定要翻译呢。说功能,我给你用delphi编一个
      

  4.   

    其实只想删除IE的历史记录,但是调用IUrlHistoryStg接口,用ClearHistory方法不能删除干净,想找个更好的方法。
      

  5.   

    不过说实话,你作这些不需要这么复杂,你在iedelphi上多看看,都是delphi处理ie的源程序,处理这个更是小菜一碟