From 2f9415777aac2005be83908a0f0d867cb8381ba6 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Wed, 6 Nov 2013 09:48:29 +0000 Subject: [PATCH] [shell32] - Improve CDefaultContextMenu::InvokePidl so it can handle opening items that are not files svn path=/trunk/; revision=60873 --- reactos/dll/win32/shell32/defcontextmenu.cpp | 43 +++++++++++++------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/reactos/dll/win32/shell32/defcontextmenu.cpp b/reactos/dll/win32/shell32/defcontextmenu.cpp index 6940213d8c1..69961fd7d92 100644 --- a/reactos/dll/win32/shell32/defcontextmenu.cpp +++ b/reactos/dll/win32/shell32/defcontextmenu.cpp @@ -1538,24 +1538,28 @@ CDefaultContextMenu::TryToBrowse( HRESULT CDefaultContextMenu::InvokePidl(LPCMINVOKECOMMANDINFO lpcmi, LPCITEMIDLIST pidl, PStaticShellEntry pEntry) { - HRESULT hr; - STRRET strFile; - - hr = m_Dcm.psf->GetDisplayNameOf(pidl, SHGDN_FORPARSING, &strFile); - if (hr != S_OK) + LPITEMIDLIST pidlFull = ILCombine(m_Dcm.pidlFolder, pidl); + if (pidlFull == NULL) { - ERR("IShellFolder_GetDisplayNameOf failed for apidl\n"); - return hr; + return E_FAIL; } WCHAR wszPath[MAX_PATH]; - hr = StrRetToBufW(&strFile, pidl, wszPath, MAX_PATH); - if (hr != S_OK) - return hr; - + BOOL bHasPath = SHGetPathFromIDListW(pidlFull, wszPath); + WCHAR wszDir[MAX_PATH]; - wcscpy(wszDir, wszPath); - PathRemoveFileSpec(wszDir); + if(bHasPath) + { + wcscpy(wszDir, wszPath); + PathRemoveFileSpec(wszDir); + } + else + { + SHGetPathFromIDListW(m_Dcm.pidlFolder, wszDir); + } + + HKEY hkeyClass; + RegOpenKeyExW(HKEY_CLASSES_ROOT, pEntry->szClass, 0, KEY_READ, &hkeyClass); SHELLEXECUTEINFOW sei; ZeroMemory(&sei, sizeof(sei)); @@ -1563,10 +1567,21 @@ CDefaultContextMenu::InvokePidl(LPCMINVOKECOMMANDINFO lpcmi, LPCITEMIDLIST pidl, sei.hwnd = lpcmi->hwnd; sei.nShow = SW_SHOWNORMAL; sei.lpVerb = pEntry->szVerb; - sei.lpFile = wszPath; sei.lpDirectory = wszDir; + sei.lpIDList = pidlFull; + sei.hkeyClass = hkeyClass; + sei.fMask = SEE_MASK_CLASSKEY | SEE_MASK_IDLIST; + if (bHasPath) + { + sei.lpFile = wszPath; + } + ShellExecuteExW(&sei); + RegCloseKey(hkeyClass); + + ILFree(pidlFull); + return S_OK; }