// 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.   

    http://www.nssoft.net/showdoc.asp?did=472
      

  2.   

    //
    type PIDesktopFolder = ^IShellFolder;
         PIMalloc = ^IMalloc;
         PITEMIDLIST = ^ITEMIDLIST;var 
      hr: HRESULT;
      pDesktopFolder: PIShellFolder;
      pMalloc: PIMalloc;
      pidlHistoryFolder: PITEMIDLIST;
      pHistoryFolder: PIShellFolder;
      pidl: PITEMIDLIST;
      fetched: ULONG;
    begin
      CoInitialize(nil);
      
      pDesktopFolder := nil;
      pMalloc := nil;
      
      // Get desktop folder.
      hr :=  SHGetMalloc(@pMalloc);
      
      // Get the history folder.
      pidlHistoryFolder := nil;
      hr := SHGetSpecialFolderLocation(0, CSIDL_HISTORY, @pidlHistoryFolder);
      
      // Get the IShellFolder of the history folder.
      pHistoryFolder := nil;
      hr := pDesktopFolder.BindToObject(pidlHistoryFolder, nil, IID_IShellFolder, (PPointer)@pHistoryFolder);  pidl := nil;
      fetched =: 0;  hr := pHistoryEnum.Next(1, @pidl, @fetched); //
      

  3.   

    //
    type PIDesktopFolder = ^IShellFolder;
         PIMalloc = ^IMalloc;
         PITEMIDLIST = ^ITEMIDLIST;
         PIContextMenu = ^IContextMenu;cosnt
      pidl2 :PITEMIDLIST;var 
      hr: HRESULT;
      pDesktopFolder: PIShellFolder;
      pMalloc: PIMalloc;
      pidlHistoryFolder: PITEMIDLIST;
      pHistoryFolder: PIShellFolder;
      pidl: PITEMIDLIST;
      fetched: ULONG;
      pContextMenu: PIContextMenu;
      pCommandInfo: CMINVOKECOMMANDINFO;
    begin
      CoInitialize(nil);
      
      pDesktopFolder := nil;
      pMalloc := nil;
      
      // Get desktop folder.
      hr :=  SHGetMalloc(@pMalloc);
      
      // Get the history folder.
      pidlHistoryFolder := nil;
      hr := SHGetSpecialFolderLocation(0, CSIDL_HISTORY, @pidlHistoryFolder);
      
      // Get the IShellFolder of the history folder.
      pHistoryFolder := nil;
      hr := pDesktopFolder.BindToObject(pidlHistoryFolder, nil, IID_IShellFolder, (PPointer)@pHistoryFolder);  pidl := nil;
      fetched =: 0;  hr := pHistoryEnum.Next(1, @pidl, @fetched);
      if SUCCEEDED(hr) then
    begin
      pidl2 :=  pidl;  // Get the IContextMenu interface.
      pContextMenu := nil;            // 0                                // 0
      hr := pHistoryFolder.GetUIObjectOf(nil, 1, @pidl2, IID_IContextMenu, nil, (PPointer)@pContextMenu);  if SUCCEEDED(hr) then
      begin
        ZeroMemory(@pCommandInfo, sizeof(pCommandInfo));
        pCommandInfo.cbSize := sizeof(CMINVOKECOMMANDINFO);
        pCommandInfo.lpVerb := 'delete';
        pCommandInfo.fMask := CMIC_MASK_FLAG_NO_UI; // has no effect
        hr := pContextMenu.InvokeCommand(@pCommandInfo);
      end;
      pContextMenu.Release();  pHistoryEnum.Release();
      pHistoryFolder.Release();
      pMalloc.Release();
      pDesktopFolder.Release();
    end;end;kankan...
      

  4.   

    hr := SHGetSpecialFolderLocation(0, CSIDL_HISTORY, pidlHistoryFolder);
    这句老是提示形参与实参类型不一致。不知道错在哪里了!
      

  5.   

    hr := SHGetSpecialFolderLocation(0, CSIDL_HISTORY, pidlHistoryFolder);->hr := SHGetSpecialFolderLocation(0, CSIDL_HISTORY, @pidlHistoryFolder);
    // 最后一个是二级指针。。
      

  6.   

    调试不过。
    hr :=  SHGetMalloc(@pMalloc); 这句开始出错。
      

  7.   

    将pMalloc定义为:
      pMalloc:IMalloc;
    hr:=OLECheck(SHGetMalloc(pMalloc));
    delphi中在定义com组件中很多都不需要指针
      

  8.   

    HRESULT SHGetMalloc(
        LPMALLOC *ppMalloc // 这是一个二级指针呀。。
    );
    那你 type PIDesktopFolder = ^IShellFolder;
         PIMalloc = ^IMalloc;
         PITEMIDLIST = ^ITEMIDLIST;
         PIContextMenu = ^IContextMenu;
    在 type PPIMalloc = ^PIMalloc;
      然后
      hr :=  SHGetMalloc(PPIMalloc(@pMalloc));  // 类型转换一下。
    什么错误信息?
      

  9.   

    HRESULT SHGetMalloc(
        LPMALLOC *ppMalloc // 这是一个二级指针呀。。
    );
    那是api定义,用C就要那样,delphi根本不同
      

  10.   

    其实只想删除IE的历史记录,但是调用IUrlHistoryStg接口,用ClearHistory方法不能删除干净,想找个更好的方法。
    以上的程序是我找到的C的版本,但是翻译后程序不起作用。
    如果没别的办法,两天后揭贴。
      

  11.   

    呵呵 我去查了一下。。DELPHI也是使用SDK版本的函数 没有进行再次封装了我是比较习惯用C++的。。
      

  12.   

    我查了一下资料,最好的还是用上面的方法。我把beyondtkl(大龙驹<梦.考古广告人生>)翻译的修改了一下,代码如下。只是不能执行删除,不知道问题出在哪。
    procedure TForm1.Button1Click(Sender: TObject);
    var 
      hr: HRESULT;
      pDesktopFolder: IShellFolder;
      pMalloc: IMalloc;
      pidlHistoryFolder: PITEMIDLIST;
      pHistoryFolder: IShellFolder;
      pidl: PITEMIDLIST;
      pidl2: PITEMIDLIST;
      fetched: LongWord;
      pContextMenu: IContextMenu;
      pCommandInfo: CMINVOKECOMMANDINFO;
      pHistoryEnum: IEnumIDList;
      mynum:integer;
      s:string;
    begin
    CoInitialize(nil);
      
      pDesktopFolder := nil;
      pMalloc := nil;
      
      // Get desktop folder.
      hr :=  SHGetMalloc(pMalloc);
      // Get desktop folder.
    hr :=SHGetDesktopFolder(pDesktopFolder);
      //showmessage(BoolToStr(false));
      // Get the history folder.
      hr := SHGetSpecialFolderLocation(handle, CSIDL_HISTORY,pidlHistoryFolder);
      //showmessage(BoolToStr(succeeded(hr)));
      setlength(s,100);
      shGetPathFromIDList(pidlHistoryFolder,pchar(s));
      //showmessage(s);
      // Get the IShellFolder of the history folder.
      pHistoryFolder := nil;
      hr := pDesktopFolder.BindToObject(pidlHistoryFolder, nil, IID_IShellFolder, Pointer(pHistoryFolder));
      //showmessage(BoolToStr(succeeded(hr)));
      // Enumerate the history items.
    pHistoryEnum := nil;
    hr := pHistoryFolder.EnumObjects(0, SHCONTF_FOLDERS and SHCONTF_NONFOLDERS, pHistoryEnum);
      //showmessage(BoolToStr(succeeded(hr)));
      pidl := nil;
      //fetched:=0;
     //hr:=pHistoryEnum.Next(1, pidl, fetched);
      showmessage(intToStr(pHistoryEnum.Next(1, pidl, fetched)));
      mynum:=0;
      while pHistoryEnum.Next(1, pidl, fetched)=S_OK do
    begin
      pidl2:=nil;
      pidl2 :=  pidl;
      //showmessage('ye');
      // Get the IContextMenu interface.
      pContextMenu := nil;            // 0                                // 0
      hr := pHistoryFolder.GetUIObjectOf(0, 1, pidl2, IID_IContextMenu, nil, Pointer(pContextMenu));  if SUCCEEDED(hr) then
      begin
        ZeroMemory(@pCommandInfo, sizeof(pCommandInfo));
        pCommandInfo.cbSize := sizeof(CMINVOKECOMMANDINFO);
        pCommandInfo.lpVerb := 'delete';
        pCommandInfo.fMask := CMIC_MASK_FLAG_NO_UI; // has no effect
        hr := pContextMenu.InvokeCommand(pCommandInfo);
      end;
       mynum:=mynum+1;
      label1.Caption:=inttostr(mynum);
      sleep(500);
    end;end;
      

  13.   

    你没加释放语句,象pHistoryEnum这些都没看你释放
      

  14.   

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

  15.   

    问题解决。在此特别鸣谢beyondtkl(大龙驹<梦.考古广告人生>)