2009-10-02 3 views
1

Я строю своего рода док, и я изо всех сил пытаюсь найти, как сохранить такие вещи, как «Запустить», «Поиск», «Справка», «Принтеры» и снова открыть их.Как выполнить/ShellExecuteEx/InvokeCommand ITEMIDLIST, указывающий на объекты Shell?

Я попытался это:

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 в папках. Что я упустил ?

ответ

4

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^