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

时间:2009-10-02 19:35:22

标签: com shellexecute windows-shell win32ole

我正在构建一种基座,我在努力寻找如何保存“运行”,“搜索”,“帮助”,“打印机”等内容并在此之后重新打开它们。

我试过了:

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);

无论我在最后一行尝试InvokeCommand,总是返回E_INVALIDARG。我尝试使用ShellExecuteEx并得到了同样的错误。

我尝试了所有可能的动词。

我试图枚举动词并获得E_INVALIDARG。

我无法使其工作,但在正常的文件系统路径上,如“c:\”和文件夹上的clsid。我错过了什么?

1 个答案:

答案 0 :(得分:4)

我找到了解决方案。我必须创建一个上下文菜单,然后使用QueryContextMenu来填充它,使用GetDefaultMenuItem()获取默认项并使用InvokeCommand调用它。

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

这非常有用:http://blogs.msdn.com/oldnewthing/archive/2004/09/30/236133.aspx