Author: rharabien
Date: Wed Dec 21 13:53:49 2011
New Revision: 54726
URL: 
http://svn.reactos.org/svn/reactos?rev=54726&view=rev
Log:
[SHELL32]
- Fix opening properties in background context menu
- Fix broken ASSERT in Open With menu
Modified:
    trunk/reactos/dll/win32/shell32/defcontextmenu.cpp
    trunk/reactos/dll/win32/shell32/fprop.cpp
    trunk/reactos/dll/win32/shell32/openwithmenu.cpp
Modified: trunk/reactos/dll/win32/shell32/defcontextmenu.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/defconte…
==============================================================================
--- trunk/reactos/dll/win32/shell32/defcontextmenu.cpp [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/defcontextmenu.cpp [iso-8859-1] Wed Dec 21 13:53:49
2011
@@ -738,6 +738,7 @@
     DWORD dwSize;
     TRACE("BuildShellItemContextMenu entered\n");
+    ASSERT(m_Dcm.cidl >= 1);
     hr = m_Dcm.psf->GetDisplayNameOf(m_Dcm.apidl[0], SHGDN_FORPARSING, &strFile);
     if (hr == S_OK)
@@ -823,7 +824,7 @@
         rfg = 0;
     }
-    if ((rfg & SFGAO_FOLDER) || _ILIsControlPanel(m_Dcm.apidl[m_Dcm.cidl]))
+    if ((rfg & SFGAO_FOLDER) || _ILIsControlPanel(m_Dcm.apidl[0]))
     {
         /* add the default verbs open / explore */
         AddStaticEntryForFileClass(L"Folder");
@@ -926,13 +927,9 @@
     UINT uFlags)
 {
     if (m_Dcm.cidl)
-    {
         idCmdFirst = BuildShellItemContextMenu(hmenu, idCmdFirst, idCmdLast, uFlags);
-    }
     else
-    {
         idCmdFirst = BuildBackgroundContextMenu(hmenu, idCmdFirst, idCmdLast, uFlags);
-    }
     return S_OK;
 }
@@ -1396,56 +1393,91 @@
 CDefaultContextMenu::DoProperties(
     LPCMINVOKECOMMANDINFO lpcmi)
 {
-    WCHAR szDrive[MAX_PATH];
+    WCHAR wszBuf[MAX_PATH];
     STRRET strFile;
-
-    if (m_Dcm.cidl && _ILIsMyComputer(m_Dcm.apidl[0]))
-    {
-        ShellExecuteW(lpcmi->hwnd, L"open", L"rundll32.exe
shell32.dll,Control_RunDLL sysdm.cpl", NULL, NULL, SW_SHOWNORMAL);
-        return S_OK;
-    }
-    else if (m_Dcm.cidl == 0 && m_Dcm.pidlFolder != NULL &&
_ILIsDesktop(m_Dcm.pidlFolder))
-    {
-        ShellExecuteW(lpcmi->hwnd, L"open", L"rundll32.exe
shell32.dll,Control_RunDLL desk.cpl", NULL, NULL, SW_SHOWNORMAL);
-        return S_OK;
-    }
-    else if (_ILIsDrive(m_Dcm.apidl[0]))
-    {
-        ILGetDisplayName(m_Dcm.apidl[0], szDrive);
-        SH_ShowDriveProperties(szDrive, m_Dcm.pidlFolder, m_Dcm.apidl);
-        return S_OK;
-    }
-    else if (_ILIsNetHood(m_Dcm.apidl[0]))
-    {
-        //FIXME path!
-        ShellExecuteW(NULL, L"open", L"explorer.exe",
-                      L"::{7007ACC7-3202-11D1-AAD2-00805FC1270E}",
-                      NULL, SW_SHOWDEFAULT);
-        return S_OK;
-    }
-    else if (_ILIsBitBucket(m_Dcm.apidl[0]))
-    {
-        /* FIXME
-         * detect the drive path of bitbucket if appropiate
-         */
-
-        SH_ShowRecycleBinProperties(L'C');
-        return S_OK;
-    }
-
-    if (m_Dcm.cidl > 1)
-        WARN("SHMultiFileProperties is not yet implemented\n");
-
-    if (m_Dcm.psf->GetDisplayNameOf(m_Dcm.apidl[0], SHGDN_FORPARSING, &strFile) !=
S_OK)
-    {
-        ERR("IShellFolder_GetDisplayNameOf failed for apidl\n");
-        return E_FAIL;
-    }
-
-    if (StrRetToBufW(&strFile, m_Dcm.apidl[0], szDrive, MAX_PATH) != S_OK)
-        return E_FAIL;
-
-    return SH_ShowPropertiesDialog(szDrive, m_Dcm.pidlFolder, m_Dcm.apidl);
+    const ITEMIDLIST *pidlParent, *pidlChild;
+    HRESULT hr = S_OK;
+
+    pidlParent = m_Dcm.pidlFolder;
+    if (!pidlParent)
+    {
+        IPersistFolder2 *pf;
+
+        /* pidlFolder is optional */
+        if (SUCCEEDED(m_Dcm.psf->QueryInterface(IID_IPersistFolder2,
(PVOID*)&pf)))
+        {
+            pf->GetCurFolder((_ITEMIDLIST**)&pidlParent);
+            pf->Release();
+        }
+    }
+
+    if (m_Dcm.cidl > 0)
+        pidlChild = m_Dcm.apidl[0];
+    else
+    {
+        /* Set pidlChild to last pidl of current folder */
+        if (pidlParent == m_Dcm.pidlFolder)
+            pidlParent = (ITEMIDLIST*)ILClone(pidlParent);
+
+        pidlChild = (ITEMIDLIST*)ILClone(ILFindLastID(pidlParent));
+        ILRemoveLastID((ITEMIDLIST*)pidlParent);
+    }
+
+    if (_ILIsMyComputer(pidlChild))
+    {
+        if (32 >= (UINT)ShellExecuteW(lpcmi->hwnd, L"open",
L"rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl", NULL, NULL,
SW_SHOWNORMAL))
+            hr = E_FAIL;
+    }
+    else if (_ILIsDesktop(pidlChild))
+    {
+        if (32 >= (UINT)ShellExecuteW(lpcmi->hwnd, L"open",
L"rundll32.exe shell32.dll,Control_RunDLL desk.cpl", NULL, NULL, SW_SHOWNORMAL))
+            hr = E_FAIL;
+    }
+    else if (_ILIsDrive(pidlChild))
+    {
+        ILGetDisplayName(pidlChild, wszBuf);
+        if (!SH_ShowDriveProperties(wszBuf, pidlParent, &pidlChild))
+            hr = E_FAIL;
+    }
+    else if (_ILIsNetHood(pidlChild))
+    {
+        // FIXME path!
+        if (32 >= (UINT)ShellExecuteW(NULL, L"open",
L"explorer.exe",
+
L"::{7007ACC7-3202-11D1-AAD2-00805FC1270E}",
+                                      NULL, SW_SHOWDEFAULT))
+            hr = E_FAIL;
+    }
+    else if (_ILIsBitBucket(pidlChild))
+    {
+        /* FIXME: detect the drive path of bitbucket if appropiate */
+        if(!SH_ShowRecycleBinProperties(L'C'))
+            hr = E_FAIL;
+    }
+    else
+    {
+        if (m_Dcm.cidl > 1)
+            WARN("SHMultiFileProperties is not yet implemented\n");
+
+        hr = m_Dcm.psf->GetDisplayNameOf(pidlChild, SHGDN_FORPARSING, &strFile);
+        if (SUCCEEDED(hr))
+        {
+            hr = StrRetToBufW(&strFile, pidlChild, wszBuf, _countof(wszBuf));
+            if (SUCCEEDED(hr))
+                hr = SH_ShowPropertiesDialog(wszBuf, pidlParent, &pidlChild);
+            else
+                ERR("StrRetToBufW failed\n");
+        }
+        else
+            ERR("IShellFolder_GetDisplayNameOf failed for apidl\n");
+    }
+
+    /* Free allocated PIDLs */
+    if (pidlParent != m_Dcm.pidlFolder)
+        ILFree((ITEMIDLIST*)pidlParent);
+    if (m_Dcm.cidl < 1 || pidlChild != m_Dcm.apidl[0])
+        ILFree((ITEMIDLIST*)pidlChild);
+
+    return hr;
 }
 HRESULT
Modified: trunk/reactos/dll/win32/shell32/fprop.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/fprop.cp…
==============================================================================
--- trunk/reactos/dll/win32/shell32/fprop.cpp [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/fprop.cpp [iso-8859-1] Wed Dec 21 13:53:49 2011
@@ -931,7 +931,7 @@
     WCHAR *pFileName;
     HPSXA hpsxa[3];
     INT_PTR res;
-    CComPtr<IDataObject>        pDataObj;
+    CComPtr<IDataObject> pDataObj;
     HRESULT hResult;
     DWORD wLength;
Modified: trunk/reactos/dll/win32/shell32/openwithmenu.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/openwith…
==============================================================================
--- trunk/reactos/dll/win32/shell32/openwithmenu.cpp [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/openwithmenu.cpp [iso-8859-1] Wed Dec 21 13:53:49 2011
@@ -1035,7 +1035,7 @@
     }
     pida = (LPIDA)GlobalLock(medium.hGlobal);
-    ASSERT(pida->cidl == 1);
+    ASSERT(pida->cidl >= 1);
     pidlFolder2 = (LPCITEMIDLIST) ((LPBYTE)pida + pida->aoffset[0]);
     pidlChild = (LPCITEMIDLIST) ((LPBYTE)pida + pida->aoffset[1]);