كيفية تنفيذ / shelllexecuteex / invokecommand intemidlist تشير إلى كائنات شل؟

StackOverflow https://stackoverflow.com/questions/1511394

سؤال

أنا أقوم ببناء نوع من الرصيف، وأصارع في العثور على كيفية حفظ أشياء مثل "تشغيل"، "البحث"، "مساعدة"، "الطابعات" وإعادة فتحها بعد ذلك.

حاولت هذا:

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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top