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