2

私は一種のドックを構築していますが、「実行」、「検索」、「ヘルプ」、「プリンター」などを保存してから再度開く方法を見つけるのに苦労しています。

私はこれを試しました:

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

1 に答える 1

5

解決策を見つけました。コンテキスト メニューを作成し、次に QueryContextMenu を作成してそれを埋め、GetDefaultMenuItem() で既定の項目を取得し、InvokeCommand で呼び出す必要があります。

デフォルトのメニュー項目から QueryContextMenu に指定された最初の項目のインデックスを減算する必要があります。そうしないと、オフセットが発生します。

これは非常に役に立ちました: http://blogs.msdn.com/oldnewthing/archive/2004/09/30/236133.aspx

于 2009-10-02T23:12:56.440 に答える