// 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();
}
解决方案 »
- 关于关机和重新启动的问题
- 出现这个提示“Field xxxForm.xxx does not have a Corresponding Component, Remove the declaration?" 是什么问题!!如何解决!!??
- 怎么样用fastreport打印dbgrid里的内容,在线等.........
- 一个好的Delphi代码工具并且能导出数据库结构.无限制试用版,任意拷贝.
- 用DELPHI写一个SQL SERVER远程数据备份程序.
- delphi里有没有类似属性控件的组件?
- 在Delphi图形图像设计中,如何顺序调用处理一组bmp格式文件?
- 數據庫組件的問題.....
- 我的痛苦谁人知?
- 请问什么地方有象163.net首页上的移动的图片动画效果的程序下载(Delphi、VC均可),或者怎样实现的?
- 帮帮忙,在线等
- 出500元人民币,寻求医院检验设备SYSMEX UF-50 的几张图形生成问题
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); //
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...
这句老是提示形参与实参类型不一致。不知道错在哪里了!
// 最后一个是二级指针。。
hr := SHGetMalloc(@pMalloc); 这句开始出错。
pMalloc:IMalloc;
hr:=OLECheck(SHGetMalloc(pMalloc));
delphi中在定义com组件中很多都不需要指针
LPMALLOC *ppMalloc // 这是一个二级指针呀。。
);
那你 type PIDesktopFolder = ^IShellFolder;
PIMalloc = ^IMalloc;
PITEMIDLIST = ^ITEMIDLIST;
PIContextMenu = ^IContextMenu;
在 type PPIMalloc = ^PIMalloc;
然后
hr := SHGetMalloc(PPIMalloc(@pMalloc)); // 类型转换一下。
什么错误信息?
LPMALLOC *ppMalloc // 这是一个二级指针呀。。
);
那是api定义,用C就要那样,delphi根本不同
以上的程序是我找到的C的版本,但是翻译后程序不起作用。
如果没别的办法,两天后揭贴。
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;