Как выполнить / ShellExecuteEx / InvokeCommand ITEMIDLIST, указывающий на объекты Shell? - PullRequest
1 голос
/ 02 октября 2009

Я строю своего рода док, и я изо всех сил пытаюсь найти способ сохранить такие вещи, как «Выполнить», «Поиск», «Справка», «Принтеры» и открыть их после этого.

Я пробовал это:

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 Ответ

4 голосов
/ 03 октября 2009

Я нашел решение. Я должен создать контекстное меню, затем QueryContextMenu, чтобы заполнить его, получить элемент по умолчанию с GetDefaultMenuItem () и вызвать его с InvokeCommand.

Необходимо вычесть индекс первого элемента, заданного для QueryContextMenu, из пункта меню по умолчанию, потому что в противном случае у вас будет смещение.

Это было очень полезно: http://blogs.msdn.com/oldnewthing/archive/2004/09/30/236133.aspx

...