@@ -237,7 +237,6 @@ HRESULT CFSDropTarget::_GetEffectFromMenu(IDataObject *pDataObject, POINTL pt, D
237237 HMENU hmenu = LoadMenuW (shell32_hInstance, MAKEINTRESOURCEW (IDM_DRAGFILE));
238238 if (!hmenu)
239239 return E_OUTOFMEMORY;
240-
241240 HMENU hpopupmenu = GetSubMenu (hmenu, 0 );
242241
243242 SHELL_LimitDropEffectToItemAttributes (pDataObject, &dwAvailableEffects);
@@ -256,7 +255,19 @@ HRESULT CFSDropTarget::_GetEffectFromMenu(IDataObject *pDataObject, POINTL pt, D
256255 else if (dwAvailableEffects & DROPEFFECT_LINK)
257256 SetMenuDefaultItem (hpopupmenu, IDM_LINKHERE, FALSE );
258257
259- /* FIXME: We need to support shell extensions here */
258+ CRegKeyHandleArray keys;
259+ HDCIA hDCIA = DCIA_Create ();
260+ HDCMA hDCMA = DCMA_Create ();
261+ CComHeapPtr<ITEMIDLIST_ABSOLUTE> pidlFolder (SHELL32_CreateSimpleIDListFromPath (m_sPathTarget, FILE_ATTRIBUTE_DIRECTORY));
262+ if (hDCMA && hDCIA && pidlFolder)
263+ {
264+ AddPidlClassKeysToArray (pidlFolder, keys, keys);
265+ for (UINT i = 0 ; i < keys; ++i)
266+ DCIA_AddShellExSubkey (hDCIA, keys[i], L" DragDropHandlers" );
267+
268+ QCMINFO qcmi = { hpopupmenu, 0 , DROPIDM_EXTFIRST, DROPIDM_EXTLAST };
269+ DCMA_InsertMenuItems (hDCMA, hDCIA, pidlFolder, pDataObject, keys, keys, &qcmi, 0 , m_site);
270+ }
260271
261272 /* We shouldn't use the site window here because the menu should work even when we don't have a site */
262273 HWND hwndDummy = CreateWindowEx (0 ,
@@ -279,16 +290,39 @@ HRESULT CFSDropTarget::_GetEffectFromMenu(IDataObject *pDataObject, POINTL pt, D
279290
280291 DestroyWindow (hwndDummy);
281292
282- if (uCommand == 0 )
283- return S_FALSE;
293+ HRESULT hr = S_FALSE; // S_FALSE means we did not handle the command
294+ C_ASSERT (IDM_COPYHERE < DROPIDM_EXTFIRST && IDM_MOVEHERE < DROPIDM_EXTFIRST &&
295+ IDM_LINKHERE < DROPIDM_EXTFIRST && DROPIDM_EXTFIRST > 0 );
296+ if (uCommand >= DROPIDM_EXTFIRST && uCommand <= DROPIDM_EXTLAST)
297+ {
298+ CMINVOKECOMMANDINFO ici = { sizeof (ici), 0 , m_hwndSite, MAKEINTRESOURCEA (uCommand - DROPIDM_EXTFIRST) };
299+ ici.nShow = SW_SHOW;
300+ if (m_grfKeyState & MK_SHIFT)
301+ ici.fMask |= CMIC_MASK_SHIFT_DOWN;
302+ if (m_grfKeyState & MK_CONTROL)
303+ ici.fMask |= CMIC_MASK_CONTROL_DOWN;
304+ DCMA_InvokeCommand (hDCMA, &ici);
305+ hr = S_OK;
306+ *pdwEffect = DROPEFFECT_NONE;
307+ }
308+ else if (uCommand == 0 )
309+ {
310+ hr = S_OK;
311+ *pdwEffect = DROPEFFECT_NONE;
312+ }
284313 else if (uCommand == IDM_COPYHERE)
285314 *pdwEffect = DROPEFFECT_COPY;
286315 else if (uCommand == IDM_MOVEHERE)
287316 *pdwEffect = DROPEFFECT_MOVE;
288317 else if (uCommand == IDM_LINKHERE)
289318 *pdwEffect = DROPEFFECT_LINK;
319+ else
320+ hr = E_UNEXPECTED;
290321
291- return S_OK;
322+ DCMA_Destroy (hDCMA);
323+ DCIA_Destroy (hDCIA);
324+ DestroyMenu (hmenu);
325+ return hr;
292326}
293327
294328HRESULT CFSDropTarget::_RepositionItems (IShellFolderView *psfv, IDataObject *pdtobj, POINTL pt)
@@ -461,7 +495,7 @@ HRESULT WINAPI CFSDropTarget::Drop(IDataObject *pDataObject,
461495 if (m_grfKeyState & MK_RBUTTON)
462496 {
463497 HRESULT hr = _GetEffectFromMenu (pDataObject, pt, pdwEffect, dwAvailableEffects);
464- if (FAILED_UNEXPECTEDLY (hr) || hr == S_FALSE )
498+ if (FAILED_UNEXPECTEDLY (hr) || hr == S_OK )
465499 return hr;
466500 }
467501
0 commit comments