كيفية تنفيذ / shelllexecuteex / invokecommand intemidlist تشير إلى كائنات شل؟
-
19-09-2019 - |
سؤال
أنا أقوم ببناء نوع من الرصيف، وأصارع في العثور على كيفية حفظ أشياء مثل "تشغيل"، "البحث"، "مساعدة"، "الطابعات" وإعادة فتحها بعد ذلك.
حاولت هذا:
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/oldnewghing/archive/2004/09/30/236133.aspx.