如何执行指向Shell对象的/ShellExecuteEx/InvokeCommand ItemIdleList?

如何执行指向Shell对象的/ShellExecuteEx/InvokeCommand ItemIdleList?,com,shellexecute,windows-shell,win32ole,Com,Shellexecute,Windows Shell,Win32ole,我正在建造一种码头,我努力寻找如何保存诸如“运行”、“搜索”、“帮助”、“打印机”之类的东西,然后重新打开它们 我试过这个: CComPtr<IShellFolder> pDF; SHGetDesktopFolder(&pDF); LPITEMIDLIST pidlPrintersAndFaxes=0; hr=pDF->ParseDisplayName(0, 0, L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2

我正在建造一种码头,我努力寻找如何保存诸如“运行”、“搜索”、“帮助”、“打印机”之类的东西,然后重新打开它们

我试过这个:

CComPtr<IShellFolder> pDF;
SHGetDesktopFolder(&pDF);

LPITEMIDLIST pidlPrintersAndFaxes=0;
hr=pDF->ParseDisplayName(0, 0, L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{2227A280-3AEA-1069-A2DE-08002B30309D}", 0, &pidlPrintersAndFaxes, NULL);

CComPtr<IShellFolder> pSF;
hr=pDF->BindToObject(pidlPrintersAndFaxes, 0, IID_IShellFolder, (void**)&pSF);

LPITEMIDLIST pidlPrinter=0;
hr=pSF->ParseDisplayName(0, 0, L"PDFCreator", 0, &pidlPrinter, NULL);

CComPtr<IContextMenu> pPrinterCtxMenu;
hr=pSF->GetUIObjectOf(0, 1, (LPCITEMIDLIST*)&pidlPrinter, IID_IContextMenu, 0, (void**)&pPrinterCtxMenu);

CMINVOKECOMMANDINFO cmd={0};
cmd.cbSize=sizeof(CMINVOKECOMMANDINFO);
cmd.lpVerb=MAKEINTRESOURCE(0);
cmd.nShow=SW_SHOWNORMAL;
hr=pPrinterCtxMenu->InvokeCommand(&cmd);
CComPtr pDF;
SHGetDesktopFolder(&pDF);
LPITEMIDLIST pidlPrintersAndFaxes=0;
hr=pDF->ParseDisplayName(0,0,L):{20D04FE0-3AEA-1069-A2D8-08002B30309D}\:{21EC2020-3AEA-1069-A2DD-08002B30309D}\::{2227A280-3AEA-1069-A2DE-08002B30309D}',0,&pidlPrintersAndFaxes,NULL);
货币基金组织;
hr=pDF->BindToObject(pidlPrintersAndFaxes,0,IID_IShellFolder,(void**)和pSF);
LPITEMIDLIST pidlPrinter=0;
hr=pSF->ParseDisplayName(0,0,L“PDFCreator”,0和pidlPrinter,NULL);
CComPtr PPRTX菜单;
hr=pSF->GetUIObjectOf(0,1,(LPCITEMIDLIST*)和pidlPrinter,IID_IContextMenu,0,(void**)和pprtextmenu);
CMINVOKECOMMANDINFO cmd={0};
cmd.cbSize=sizeof(CMINVOKECOMMANDINFO);
cmd.lpVerb=MAKEINTRESOURCE(0);
cmd.nShow=SW_SHOWNORMAL;
hr=pprtxmenu->InvokeCommand(&cmd);
无论我在最后一行调用什么命令,总是返回E_INVALIDARG。我用ShellExecuteEx试过了,结果也出现了同样的错误

我试了所有可能的动词

我试着列举动词,结果发现E_INVALIDARG


我不能让它工作,但在正常的文件系统路径上,如文件夹上的“c:\”和clsid。我错过了什么?我找到了解决办法。我必须创建一个上下文菜单,然后使用QueryContextMenu填充它,使用GetDefaultMenuItem()获取默认项,并使用InvokeCommand调用它

有必要从默认菜单项中减去给定给QueryContextMenu的第一项的索引,否则将有一个偏移量

这非常有帮助: