Создать DataObject из Shell Run / Help (MFC C++)

Мне нужна помощь в создании IDataObject для включения перетаскивания этих 2 элементов (Выполнить и Справка). Например, мне нужно сделать так же, как в Windows Startmenu.

чтобы запустить их, я использую эти

CComPtr<IShellDispatch2> pShellDisp;
if (SUCCEEDED(CoCreateInstance(CLSID_Shell,NULL,CLSCTX_SERVER,IID_IShellDispatch2,(void**)&pShellDisp)))
{
    pShellDisp->Help();    //Help
    pShellDisp->FileRun(); //Run
}

Ребята, вы можете мне помочь?

PS: мне нужно перетащить с изображением иконы тоже

РЕДАКТИРОВАТЬ [решено]

IShellFolder* desk = NULL;
                HRESULT hr =SHGetDesktopFolder(&desk);
                LPITEMIDLIST pidl2=NULL;
                ULONG cbEaten;
                DWORD dwAttribs = 0 ;

                hr = desk->ParseDisplayName(NULL,
                                             NULL,
                                             L"shell:::{2559a1f3-21d7-11d4-bdaf-00c04f60b9f0}",
                                             &cbEaten,  // This can be NULL
                                             &pidl2,
                                             &dwAttribs);
                hr = desk->GetUIObjectOf(parentHwnd, 1,
                        (PCITEMID_CHILD*)&pidl2, IID_IDataObject, 0, (LPVOID *)lpdataObj);

                desk->Release();
                return;

для бега:

shell:::{2559a1f3-21d7-11d4-bdaf-00c04f60b9f0} 

1 ответ

Я предполагаю, что вам нужен только один из этих элементов в объекте данных в любой момент времени, в этом случае:

Если вы хотите перетащить оба элемента в одной и той же операции, то все становится сложнее. Я не знаю, если оба этих объекта имеют одного и того же родителя. Если они это сделают, то даже старый CIDLData_CreateFromIDArray может справиться с этим. Если они этого не делают, вы можете попробовать SHCreateShellItemArrayFromIDLists и затем использовать IShellItemArray::BindToHandler(...,BHID_DataObject,...), Для поддержки CFSTR_SHELLIDLIST и добавить его в объект данных.

Перетаскивание изображений на самом деле не связано с этим и должно быть задано в отдельном вопросе, где вы включаете информацию о вашем IDragSourceHelper и т. Д.

Другие вопросы по тегам