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

标签 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 上。我错过了什么?

最佳答案

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

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

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

关于com - 如何执行/ShellExecuteEx/InvokeCommand ITEMIDLIST指向Shell对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1511394/

相关文章:

javascript - 如何使用来自 javascript 的参数运行 cmd.exe

c++ - IThumbnailProvider 和 IInitializeWithItem

windows - 如何将多个关联文件传递给一个程序?

c# - Excel Interop : reference by number, 不是字符串

COM - 如何创建返回接口(interface)指针的方法?

.net - 在 .Net 和 COM 程序集之间传递数据的性能

delphi - shellexecute 无法为某些用户打开 http 链接

powershell - 从其他软件调用 Powershell 脚本

c++ - 如何使用某个驱动器中打开的文件夹关闭 Windows 资源管理器窗口

c++ - 轮询默认端点上的 Audio Session 有时会在 Win7 上崩溃