[SHELL32]
authorRafal Harabien <rafalh@reactos.org>
Sat, 17 Dec 2011 22:48:16 +0000 (22:48 +0000)
committerRafal Harabien <rafalh@reactos.org>
Sat, 17 Dec 2011 22:48:16 +0000 (22:48 +0000)
- Revert 54075 hack (registration from old shell32 based on WINE), so things does not get registered twice. Two Control Panels in MyComputer are no longer visible
- Fix all regressions, which was hack-fixed before.
- Add more debug output in case of errors

svn path=/trunk/; revision=54673

15 files changed:
reactos/dll/win32/shell32/classes.cpp
reactos/dll/win32/shell32/pidl.cpp
reactos/dll/win32/shell32/pidl.h
reactos/dll/win32/shell32/res/rgs/controlpanel.rgs
reactos/dll/win32/shell32/res/rgs/fontsfoldershortcut.rgs
reactos/dll/win32/shell32/she_ocmenu.cpp
reactos/dll/win32/shell32/shell32_main.cpp
reactos/dll/win32/shell32/shfldr_admintools.cpp
reactos/dll/win32/shell32/shfldr_cpanel.cpp
reactos/dll/win32/shell32/shfldr_fonts.cpp
reactos/dll/win32/shell32/shfldr_mycomp.cpp
reactos/dll/win32/shell32/shfldr_printers.cpp
reactos/dll/win32/shell32/shlfolder.cpp
reactos/dll/win32/shell32/shlview.cpp
reactos/dll/win32/shell32/shv_def_cmenu.cpp

index fe69656..0c4debb 100644 (file)
@@ -324,7 +324,7 @@ static const WCHAR swEmpty[] = {0};
 
 BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len)
 {
-    HKEY    hkey;
+    HKEY hkey;
     BOOL ret = FALSE;
     DWORD buflen = len;
     WCHAR szName[100];
@@ -346,8 +346,8 @@ BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len)
     {
       static const WCHAR wszLocalizedString[] =
       { 'L','o','c','a','l','i','z','e','d','S','t','r','i','n','g', 0 };
-      if (!RegLoadMUIStringW(hkey, wszLocalizedString, szDest, len, NULL, 0, NULL) ||
-              !RegQueryValueExW(hkey, swEmpty, 0, NULL, (LPBYTE)szDest, &len))
+      if (RegLoadMUIStringW(hkey, wszLocalizedString, szDest, len, NULL, 0, NULL) == ERROR_SUCCESS ||
+          !RegQueryValueExW(hkey, swEmpty, 0, NULL, (LPBYTE)szDest, &len) == ERROR_SUCCESS)
       {
         ret = TRUE;
       }
@@ -386,8 +386,8 @@ BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len)
         if(LoadStringW(shell32_hInstance, IDS_ADMINISTRATIVETOOLS, szDest, buflen))
           ret = TRUE;
       }
-
     }
+
     TRACE("-- %s\n", debugstr_w(szDest));
     return ret;
 }
index c0fedee..ce65e6d 100644 (file)
@@ -1222,11 +1222,17 @@ BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
         return FALSE;
 
     hr = SHBindToParent(pidl, IID_IShellFolder, (VOID**)&psfFolder, &pidlLast);
-    if (FAILED(hr)) return FALSE;
+    if (FAILED(hr))
+    {
+        ERR("SHBindToParent failed: %x\n", hr);
+        return FALSE;
+    }
 
     dwAttributes = SFGAO_FILESYSTEM;
     hr = psfFolder->GetAttributesOf(1, &pidlLast, &dwAttributes);
-    if (FAILED(hr) || !(dwAttributes & SFGAO_FILESYSTEM)) {
+    if (FAILED(hr) || !(dwAttributes & SFGAO_FILESYSTEM))
+    {
+        WARN("Wrong dwAttributes or GetAttributesOf failed: %x\n", hr);
         return FALSE;
     }
 
@@ -1592,7 +1598,7 @@ BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
 {
     TRACE("(%p)\n",pidl);
 
-    return pidl && pidl->mkid.cb  ? 0 : 1;
+    return pidl && pidl->mkid.cb ? 0 : 1;
 }
 
 BOOL _ILIsMyDocuments(LPCITEMIDLIST pidl)
index 2ba343c..1de0707 100644 (file)
 #define PT_NETWORK     0x47
 #define PT_IESPECIAL1  0x61
 #define PT_YAGUID      0x70 /* yet another guid.. */
+#define PT_CPEXT       0x71
 #define PT_IESPECIAL2  0xb1
 #define PT_SHARE       0xc3
 
index 298ff87..396b583 100644 (file)
@@ -2,7 +2,7 @@ HKCR
 {
        NoRemove CLSID
        {
-               ForceRemove {21EC2020-3AEA-1069-A2DD-08002B30309D}
+               ForceRemove {21EC2020-3AEA-1069-A2DD-08002B30309D} = s 'Control Panel'
                {
                        val InfoTip = e '@%%SystemRoot%%\system32\SHELL32.dll,-31361'
                        DefaultIcon = e '%%SystemRoot%%\System32\shell32.dll,-137'
@@ -12,7 +12,7 @@ HKCR
                        }
                        ShellFolder
                        {
-                               val Attributes = d '0'
+                               val Attributes = d '&H00000000'
                                val HideAsDeletePerUser = s ''
                                val WantsFORDISPLAY = s ''
                        }
index 69591c6..5ab751d 100644 (file)
@@ -23,7 +23,7 @@ HKCR
                        }
                        'ShellFolder'
                        {
-                               val Attributes = d '&H60000100'
+                               val Attributes = d '&H60000000'
                                val WantsFORPARSING = s ''
                        }
                }
index 62f17e7..e39fabb 100644 (file)
@@ -153,12 +153,11 @@ HRESULT WINAPI COpenWithMenu::QueryContextMenu(
     HMENU hSubMenu = NULL;
     OPEN_WITH_CONTEXT Context;
     
-    if (LoadStringW(shell32_hInstance, IDS_OPEN_WITH, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)) < 0)
+    if (!LoadStringW(shell32_hInstance, IDS_OPEN_WITH, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
     {
-       TRACE("failed to load string\n");
+       ERR("failed to load string\n");
        return E_FAIL;
     }
-    szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
 
     hSubMenu = CreatePopupMenu();
 
@@ -798,7 +797,7 @@ InsertOpenWithItem(POPEN_WITH_CONTEXT pContext, WCHAR * szAppName)
     MENUITEMINFOW mii;
     POPEN_ITEM_CONTEXT pItemContext;
     LRESULT index;
-    WCHAR * Offset;
+    WCHAR *pwszExt;
     WCHAR Buffer[_MAX_FNAME];
 
     pItemContext = (OPEN_ITEM_CONTEXT *)HeapAlloc(GetProcessHeap(), 0, sizeof(OPEN_ITEM_CONTEXT));
@@ -807,13 +806,11 @@ InsertOpenWithItem(POPEN_WITH_CONTEXT pContext, WCHAR * szAppName)
 
     /* store app path */
     wcscpy(pItemContext->szAppName, szAppName);
-    /* null terminate it */
-    pItemContext->szAppName[MAX_PATH-1] = 0;
     /* extract path name */
     _wsplitpath(szAppName, NULL, NULL, Buffer, NULL);
-    Offset = wcsrchr(Buffer, '.');
-    if (Offset)
-        Offset[0] = L'\0';
+    pwszExt = wcsrchr(Buffer, '.');
+    if (pwszExt)
+        pwszExt[0] = L'\0';
     Buffer[0] = towupper(Buffer[0]);
 
     if (pContext->bMenu)
@@ -840,7 +837,7 @@ InsertOpenWithItem(POPEN_WITH_CONTEXT pContext, WCHAR * szAppName)
          pItemContext->hIcon = ExtractIconW(shell32_hInstance, szAppName, 0);
          /* get manufacturer */
         GetManufacturer(pItemContext->szAppName, pItemContext);
-         index = SendMessageW(pContext->hDlgCtrl, LB_ADDSTRING, 0, (LPARAM)Buffer);
+        index = SendMessageW(pContext->hDlgCtrl, LB_ADDSTRING, 0, (LPARAM)Buffer);
         if (index != LB_ERR)
             SendMessageW(pContext->hDlgCtrl, LB_SETITEMDATA, index, (LPARAM)pItemContext);
     }
@@ -879,7 +876,10 @@ AddItemFromMRUList(POPEN_WITH_CONTEXT pContext, HKEY hKey)
     /* open mru list */
     hList = OpenMRUList(hKey);
     if (!hList)
+    {
+        ERR("OpenMRUList failed\n");
         return;
+    }
 
     /* get list count */
     nCount = EnumMRUListW(hList, -1, NULL, 0);
@@ -933,11 +933,11 @@ LoadItemFromHKCR(POPEN_WITH_CONTEXT pContext, const WCHAR * szExt)
 
         if (RegGetValueW(hSubKey, NULL, NULL, RRF_RT_REG_SZ, NULL, (PVOID)szBuffer, &dwBuffer) == ERROR_SUCCESS)
         {
-            WCHAR * Ext = wcsrchr(szBuffer, ' ');
-            if (Ext)
+            WCHAR * pszSpace = wcsrchr(szBuffer, ' ');
+            if (pszSpace)
             {
                 /* erase %1 or extra arguments */
-                Ext[0] = 0;
+                *pszSpace = 0; // FIXME: what about '"'
             }
             if(!HideApplicationFromList(szBuffer))
                 InsertOpenWithItem(pContext, szBuffer);
@@ -1022,8 +1022,8 @@ COpenWithMenu::SHEOW_LoadOpenWithItems(IDataObject *pdtobj)
     LPCITEMIDLIST pidl_folder;
     LPCITEMIDLIST pidl_child; 
     LPCITEMIDLIST pidl; 
-    DWORD dwPath;
-    LPWSTR szPtr;
+    DWORD dwType;
+    LPWSTR pszExt;
     static const WCHAR szShortCut[] = { '.','l','n','k', 0 };
 
     fmt.cfFormat = RegisterClipboardFormatW(CFSTR_SHELLIDLIST);
@@ -1040,11 +1040,11 @@ COpenWithMenu::SHEOW_LoadOpenWithItems(IDataObject *pdtobj)
         return hr;
     }
 
-        /*assert(pida->cidl==1);*/
     pida = (LPIDA)GlobalLock(medium.hGlobal);
+    ASSERT(pida->cidl==1);
 
-    pidl_folder = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[0]);
-    pidl_child = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[1]);
+    pidl_folder = (LPCITEMIDLIST) ((LPBYTE)pida + pida->aoffset[0]);
+    pidl_child = (LPCITEMIDLIST) ((LPBYTE)pida + pida->aoffset[1]);
 
     pidl = ILCombine(pidl_folder, pidl_child);
 
@@ -1057,7 +1057,7 @@ COpenWithMenu::SHEOW_LoadOpenWithItems(IDataObject *pdtobj)
         return E_OUTOFMEMORY;
     }
     if (_ILIsDesktop(pidl) || _ILIsMyDocuments(pidl) || _ILIsControlPanel(pidl) || _ILIsNetHood(pidl) ||
-        _ILIsBitBucket(pidl) || _ILIsDrive(pidl) || _ILIsCPanelStruct(pidl) || _ILIsFolder(pidl) || _ILIsControlPanel(pidl))
+        _ILIsBitBucket(pidl) || _ILIsDrive(pidl) || _ILIsCPanelStruct(pidl) || _ILIsFolder(pidl))
     {
         TRACE("pidl is a folder\n");
         SHFree((void*)pidl);
@@ -1066,35 +1066,35 @@ COpenWithMenu::SHEOW_LoadOpenWithItems(IDataObject *pdtobj)
 
     if (!SHGetPathFromIDListW(pidl, szPath))
     {
+        IID *iid = _ILGetGUIDPointer(pidl);
         SHFree((void*)pidl);
-        ERR("SHGetPathFromIDListW failed\n");
+        ERR("SHGetPathFromIDListW failed %s\n", iid ? shdebugstr_guid(iid) : "");
         return E_FAIL;
     }
-    
+
     SHFree((void*)pidl);
     TRACE("szPath %s\n", debugstr_w(szPath));
 
-    if (GetBinaryTypeW(szPath, &dwPath))
+    if (GetBinaryTypeW(szPath, &dwType))
     {
-        TRACE("path is a executable %x\n", dwPath);
+        TRACE("path is a executable %x\n", dwType);
         return E_FAIL;
     }
 
-    szPtr = wcsrchr(szPath, '.');
-    if (szPtr)
+    pszExt = wcsrchr(szPath, L'.');
+    if (pszExt && !_wcsicmp(pszExt, szShortCut))
     {
-        if (!_wcsicmp(szPtr, szShortCut))
-        {
-            FIXME("pidl is a shortcut\n");
-            return E_FAIL;
-        }
+        FIXME("pidl is a shortcut\n");
+        return E_FAIL;
     }
+
     return S_OK;
 }
 
 HRESULT WINAPI
 COpenWithMenu::Initialize(LPCITEMIDLIST pidlFolder,
-                              IDataObject *pdtobj, HKEY hkeyProgID )
+                          IDataObject *pdtobj,
+                          HKEY hkeyProgID)
 {
     TRACE("This %p\n", this);
 
@@ -1103,10 +1103,9 @@ COpenWithMenu::Initialize(LPCITEMIDLIST pidlFolder,
     return SHEOW_LoadOpenWithItems(pdtobj);
 }
 
-HRESULT WINAPI SHOpenWithDialog(
-  HWND hwndParent,
-  const OPENASINFO *poainfo
-)
+HRESULT WINAPI
+SHOpenWithDialog(HWND hwndParent,
+                 const OPENASINFO *poainfo)
 {
     MSG msg;
     BOOL bRet;
index d76d27b..4a9ec2d 100644 (file)
@@ -1462,8 +1462,11 @@ STDAPI DllRegisterServer()
     if (FAILED(hr))
         return hr;
 
-    // extra registration stuff for the IShellFolder
-    return DoRegisterServer();
+    hr = SHELL_RegisterShellFolders();
+    if (FAILED(hr))
+        return hr;
+
+    return S_OK;
 }
 
 /***********************************************************************
@@ -1481,8 +1484,7 @@ STDAPI DllUnregisterServer()
     if (FAILED(hr))
         return hr;
 
-    // extra stuff which is performed for IShellFolder
-    return DoUnregisterServer();
+    return S_OK;
 }
 
 /*************************************************************************
index 8c056c6..e83cf23 100644 (file)
@@ -365,9 +365,9 @@ HRESULT WINAPI CAdminToolsFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwF
     if (!pszPath)
         return E_OUTOFMEMORY;
 
-    ZeroMemory(pszPath, (MAX_PATH +1) * sizeof(WCHAR));
+    ZeroMemory(pszPath, (MAX_PATH + 1) * sizeof(WCHAR));
 
-    if (_ILIsAdminTools (pidl))
+    if (!pidl->mkid.cb)
     {
         if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
             (GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING))
index 0f9b07b..132b675 100644 (file)
@@ -480,13 +480,14 @@ HRESULT WINAPI CControlPanelFolder::GetAttributesOf(UINT cidl, LPCITEMIDLIST * a
         return E_INVALIDARG;
 
     if (*rgfInOut == 0)
-    *rgfInOut = ~0;
+        *rgfInOut = ~0;
 
-    while(cidl > 0 && *apidl) {
-    pdump(*apidl);
-    SHELL32_GetItemAttributes(this, *apidl, rgfInOut);
-    apidl++;
-    cidl--;
+    while(cidl > 0 && *apidl)
+    {
+        pdump(*apidl);
+        SHELL32_GetItemAttributes(this, *apidl, rgfInOut);
+        apidl++;
+        cidl--;
     }
     /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
     *rgfInOut &= ~SFGAO_VALIDATE;
@@ -567,14 +568,15 @@ HRESULT WINAPI CControlPanelFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD d
     CHAR szName[MAX_PATH];
     WCHAR wszName[MAX_PATH+1]; /* +1 for potential backslash */
     PIDLCPanelStruct *pCPanel;
+    HRESULT hr;
 
     *szName = '\0';
 
     TRACE("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
     pdump(pidl);
 
-    if (!pidl || !strRet)
-    return E_INVALIDARG;
+    if (!pidl)
+        return S_FALSE;
 
     pCPanel = _ILGetCPanelPointer(pidl);
 
@@ -588,38 +590,38 @@ HRESULT WINAPI CControlPanelFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD d
     else if (_ILIsSpecialFolder(pidl))
     {
         BOOL bSimplePidl = _ILIsPidlSimple(pidl);
-
-        if (bSimplePidl)
+        SFGAOF Attr = SFGAO_FILESYSTEM;
+        
+        SHELL32_GetItemAttributes(this, pidl, &Attr);
+        if (Attr & SFGAO_FILESYSTEM)
+        {
+            hr = SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, wszName, sizeof(wszName));
+            if (FAILED(hr))
+                return hr;
+        }
+        else if (bSimplePidl)
         {
             _ILSimpleGetTextW(pidl, wszName, MAX_PATH);    /* append my own path */
         }
         else
         {
             FIXME("special pidl\n");
-        }
-
-        if ((dwFlags & SHGDN_FORPARSING) && !bSimplePidl)
-        {
-            /* go deeper if needed */
-            int len = 0;
+            if (dwFlags & SHGDN_FORPARSING)
+            {
+                /* go deeper if needed */
+                int cchName;
 
-            PathAddBackslashW(wszName);
-            len = wcslen(wszName);
+                PathAddBackslashW(wszName);
+                cchName = wcslen(wszName);
 
-            if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, wszName + len, MAX_PATH + 1 - len)))
-                return E_OUTOFMEMORY;
-            
-            if (!WideCharToMultiByte(CP_ACP, 0, wszName, -1, szName, MAX_PATH, NULL, NULL))
-                wszName[0] = '\0';
-        }
-        else
-        {
-            if (bSimplePidl)
-            {
-                if (!WideCharToMultiByte(CP_ACP, 0, wszName, -1, szName, MAX_PATH, NULL, NULL))
-                    wszName[0] = '\0';
+                hr = SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, wszName + cchName, MAX_PATH + 1 - cchName);
+                if (FAILED(hr))
+                    return hr;
             }
         }
+
+        if (!WideCharToMultiByte(CP_ACP, 0, wszName, -1, szName, MAX_PATH, NULL, NULL))
+            szName[0] = '\0';
     }
 
     strRet->uType = STRRET_CSTR;
@@ -796,15 +798,10 @@ ExecuteAppletFromCLSID(LPOLESTR pOleStr)
     dwSize = sizeof(szCmd);
     if (RegGetValueW(HKEY_CLASSES_ROOT, szBuffer, NULL, RRF_RT_REG_SZ, &dwType, (PVOID)szCmd, &dwSize) != ERROR_SUCCESS)
     {
-        ERR("RegGetValueW failed with %u\n", GetLastError());
+        ERR("RegGetValueW(%ls) failed with %u\n", szBuffer, GetLastError());
         return E_FAIL;
     }
 
-#if 0
-    if (dwType != RRF_RT_REG_SZ && dwType != RRF_RT_REG_EXPAND_SZ)
-        return E_FAIL;
-#endif
-
     if (!ExpandEnvironmentStringsW(szCmd, szExpCmd, sizeof(szExpCmd)/sizeof(WCHAR)))
         return E_FAIL;
 
@@ -846,7 +843,6 @@ HRESULT WINAPI CControlPanelFolder::Execute(LPSHELLEXECUTEINFOW psei)
             return E_INVALIDARG;
         if (StringFromCLSID(*iid, &pOleStr) == S_OK)
         {
-
             hr = ExecuteAppletFromCLSID(pOleStr);
             CoTaskMemFree(pOleStr);
             return hr;
index 50a849f..25c5497 100644 (file)
@@ -436,7 +436,7 @@ HRESULT WINAPI CFontsFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDL
 */
 HRESULT WINAPI CFontsFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
 {
-    PIDLFontStruct * pfont;
+    PIDLFontStruct *pFont;
 
     TRACE("ISF_Fonts_fnGetDisplayNameOf (%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
     pdump (pidl);
@@ -444,16 +444,38 @@ HRESULT WINAPI CFontsFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags,
     if (!strRet)
         return E_INVALIDARG;
 
-    pfont = _ILGetFontStruct(pidl);
-    if (!pfont)
-        return E_INVALIDARG;
+    pFont = _ILGetFontStruct(pidl);
+    if (pFont)
+    {
+        strRet->pOleStr = (LPWSTR)CoTaskMemAlloc((wcslen(pFont->szName)+1) * sizeof(WCHAR));
+        if (!strRet->pOleStr)
+            return E_OUTOFMEMORY;
 
-    strRet->pOleStr = (LPWSTR)CoTaskMemAlloc((wcslen(pfont->szName)+1) * sizeof(WCHAR));
-    if (!strRet->pOleStr)
-        return E_OUTOFMEMORY;
+        wcscpy(strRet->pOleStr, pFont->szName);
+        strRet->uType = STRRET_WSTR;
+    }
+    else if (!pidl->mkid.cb)
+    {
+        WCHAR wszPath[MAX_PATH];
 
-    wcscpy(strRet->pOleStr, pfont->szName);
-    strRet->uType = STRRET_WSTR;
+        if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
+            (GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING))
+        {
+            if (!SHGetSpecialFolderPathW(NULL, wszPath, CSIDL_FONTS, FALSE))
+                return E_FAIL;
+        }
+        else if (!HCR_GetClassNameW(CLSID_FontsFolderShortcut, wszPath, MAX_PATH))
+            return E_FAIL;
+
+        strRet->pOleStr = (LPWSTR)CoTaskMemAlloc((wcslen(wszPath) + 1) * sizeof(WCHAR));
+        if (!strRet->pOleStr)
+            return E_OUTOFMEMORY;
+
+        wcscpy(strRet->pOleStr, wszPath);
+        strRet->uType = STRRET_WSTR;
+    }
+    else
+        return E_INVALIDARG;
 
     return S_OK;
 }
index 076c6cb..f66b926 100644 (file)
@@ -136,11 +136,12 @@ BOOL CDrivesFolderEnum::CreateMyCompEnumList(DWORD dwFlags)
                             RegGetValueW(hKey, wszBuf, NULL, RRF_RT_REG_SZ, NULL, wszBuf, &dwSize);
                         }
 
-                        /* FIXME: shell extensions, shouldn't the type be
-                         * PT_SHELLEXT? */
+                        /* FIXME: shell extensions - the type should be PT_SHELLEXT (tested) */
                         pidl = _ILCreateGuidFromStrW(wszBuf);
                         if (pidl != NULL)
                             bRet = AddToEnumList(pidl);
+                        else
+                            ERR("Invalid MyComputer namespace extesion: %s\n", wszBuf);
                         j++;
                     }
                     else if (ERROR_NO_MORE_ITEMS == ErrorCode)
@@ -171,17 +172,19 @@ HRESULT WINAPI CDrivesFolder::FinalConstruct()
 {
     DWORD dwSize;
     WCHAR szName[MAX_PATH];
+    WCHAR wszMyCompKey[256];
+    INT i;
 
     pidlRoot = _ILCreateMyComputer();    /* my qualified pidl */
     if (pidlRoot == NULL)
         return E_OUTOFMEMORY;
 
+    i = swprintf(wszMyCompKey, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\");
+    StringFromGUID2(CLSID_MyComputer, wszMyCompKey + i, sizeof(wszMyCompKey)/sizeof(wszMyCompKey[0]) - i);
     dwSize = sizeof(szName);
-    if (RegGetValueW(HKEY_CURRENT_USER,
-                     L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\{20D04FE0-3AEA-1069-A2D8-08002B30309D}",
+    if (RegGetValueW(HKEY_CURRENT_USER, wszMyCompKey,
                      NULL, RRF_RT_REG_SZ, NULL, szName, &dwSize) == ERROR_SUCCESS)
     {
-        szName[MAX_PATH - 1] = 0;
         sName = (LPWSTR)SHAlloc((wcslen(szName) + 1) * sizeof(WCHAR));
         if (sName)
         {
@@ -384,10 +387,12 @@ HRESULT WINAPI CDrivesFolder::GetAttributesOf (UINT cidl, LPCITEMIDLIST * apidl,
     if (*rgfInOut == 0)
         *rgfInOut = ~0;
 
-    if(cidl == 0) {
+    if(cidl == 0)
         *rgfInOut &= dwComputerAttributes;
-    } else {
-        while (cidl > 0 && *apidl) {
+    else
+    {
+        while (cidl > 0 && *apidl)
+        {
             pdump (*apidl);
             SHELL32_GetItemAttributes (this, *apidl, rgfInOut);
             apidl++;
index 05650aa..cef7de1 100644 (file)
@@ -561,7 +561,7 @@ HRESULT WINAPI CPrinterFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlag
         return E_INVALIDARG;
     }
 
-    if (_ILIsPrinter(pidl))
+    if (!pidl->mkid.cb)
     {
         pszName = (LPWSTR)CoTaskMemAlloc(MAX_PATH * sizeof(WCHAR));
         if (!pszName)
index c142374..91cf528 100644 (file)
@@ -318,25 +318,28 @@ HRESULT SHELL32_GetDisplayNameOfChild (IShellFolder2 * psf,
     TRACE ("(%p)->(pidl=%p 0x%08x %p 0x%08x)\n", psf, pidl, dwFlags, szOut, dwOutLen);
     pdump (pidl);
 
-    pidlFirst = ILCloneFirst (pidl);
-    if (pidlFirst) {
-    IShellFolder2 *psfChild;
+    pidlFirst = ILCloneFirst(pidl);
+    if (pidlFirst)
+    {
+        IShellFolder *psfChild;
 
-    hr = psf->BindToObject(pidlFirst, NULL, IID_IShellFolder, (LPVOID *) & psfChild);
-    if (SUCCEEDED (hr)) {
-        STRRET strTemp;
-        LPITEMIDLIST pidlNext = ILGetNext (pidl);
+        hr = psf->BindToObject(pidlFirst, NULL, IID_IShellFolder, (LPVOID *) & psfChild);
+        if (SUCCEEDED (hr))
+        {
+            STRRET strTemp;
+            LPITEMIDLIST pidlNext = ILGetNext (pidl);
 
-        hr = psfChild->GetDisplayNameOf(pidlNext, dwFlags, &strTemp);
-        if (SUCCEEDED (hr)) {
-        if(!StrRetToStrNW (szOut, dwOutLen, &strTemp, pidlNext))
+            hr = psfChild->GetDisplayNameOf(pidlNext, dwFlags, &strTemp);
+            if (SUCCEEDED (hr))
+            {
+                if(!StrRetToStrNW (szOut, dwOutLen, &strTemp, pidlNext))
                     hr = E_FAIL;
+            }
+            psfChild->Release();
         }
-        psfChild->Release();
-    }
-    ILFree (pidlFirst);
+        ILFree (pidlFirst);
     } else
-    hr = E_OUTOFMEMORY;
+        hr = E_OUTOFMEMORY;
 
     TRACE ("-- ret=0x%08x %s\n", hr, debugstr_w(szOut));
 
@@ -394,13 +397,20 @@ HRESULT SHELL32_GetItemAttributes (IShellFolder * psf, LPCITEMIDLIST pidl, LPDWO
 
     dwAttributes = *pdwAttributes;
 
-    if (_ILIsDrive (pidl)) {
+    /* Attributes of some special folders are hardcoded */
+    if (_ILIsDrive(pidl)) {
         *pdwAttributes &= SFGAO_HASSUBFOLDER|SFGAO_FILESYSTEM|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR|
-        SFGAO_DROPTARGET|SFGAO_HASPROPSHEET|SFGAO_CANRENAME;
+                          SFGAO_DROPTARGET|SFGAO_HASPROPSHEET|SFGAO_CANRENAME;
+    } else if (_ILIsMyComputer(pidl) || _ILIsNetHood(pidl)) {
+        *pdwAttributes &= SFGAO_HASSUBFOLDER|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR|
+                          SFGAO_DROPTARGET|SFGAO_HASPROPSHEET|SFGAO_CANDELETE|
+                          SFGAO_CANRENAME|SFGAO_CANLINK;
+    } else if (_ILIsControlPanel(pidl)) {
+        *pdwAttributes &= SFGAO_HASSUBFOLDER|SFGAO_FOLDER|SFGAO_CANLINK;
     } else if (has_guid && HCR_GetFolderAttributes(pidl, &dwAttributes)) {
-    *pdwAttributes = dwAttributes;
-    } else if (_ILGetDataPointer (pidl)) {
-    dwAttributes = _ILGetFileAttributes (pidl, NULL, 0);
+        *pdwAttributes = dwAttributes;
+    } else if (_ILGetDataPointer(pidl)) {
+        dwAttributes = _ILGetFileAttributes(pidl, NULL, 0);
 
         if (!dwAttributes && has_guid) {
         WCHAR path[MAX_PATH];
@@ -419,9 +429,9 @@ HRESULT SHELL32_GetItemAttributes (IShellFolder * psf, LPCITEMIDLIST pidl, LPDWO
         }
     }
 
-        /* Set common attributes */
-        *pdwAttributes |= SFGAO_FILESYSTEM | SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANDELETE |
-                          SFGAO_CANRENAME | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANCOPY;
+    /* Set common attributes */
+    *pdwAttributes |= SFGAO_FILESYSTEM | SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANDELETE |
+                      SFGAO_CANRENAME | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANCOPY;
 
     if (dwAttributes & FILE_ATTRIBUTE_DIRECTORY)
     {
index a2661b5..daee376 100644 (file)
@@ -1131,13 +1131,18 @@ HRESULT CDefView::OpenSelectedItems()
                     ici.lpVerb = MAKEINTRESOURCEA( def );
                     ici.hwnd = m_hWnd;
 
-                    if (cm->InvokeCommand((LPCMINVOKECOMMANDINFO) &ici ) == S_OK)
+                    hr = cm->InvokeCommand((LPCMINVOKECOMMANDINFO)&ici);
+                    if (hr == S_OK)
                     {
-                        DestroyMenu( hmenu );
+                        DestroyMenu(hmenu);
                         hr = IUnknown_SetSite(cm, NULL);
                         return S_OK;
                     }
+                    else
+                        ERR("InvokeCommand failed: %x\n", hr);
                 }
+                else
+                    ERR("No default context menu item\n");
                 
             }
             DestroyMenu( hmenu );
@@ -1160,7 +1165,7 @@ HRESULT CDefView::OpenSelectedItems()
     {
         CF_IDLIST = RegisterClipboardFormatW(CFSTR_SHELLIDLIST);
     }
-    
+
     fetc.cfFormat = CF_IDLIST;
     fetc.ptd = NULL;
     fetc.dwAspect = DVASPECT_CONTENT;
index 61fcc49..06a4a8b 100644 (file)
@@ -309,6 +309,7 @@ HasClipboardData()
     return ret;
 }
 
+static
 VOID
 DisablePasteOptions(HMENU hMenu)
 {
@@ -338,28 +339,25 @@ IDefaultContextMenuImpl::IsShellExtensionAlreadyLoaded(const CLSID * szClass)
 
 
 HRESULT
-IDefaultContextMenuImpl::SH_LoadDynamicContextMenuHandler(HKEY hKey, const CLSID * szClass, BOOL bExternalInit)
+IDefaultContextMenuImpl::SH_LoadDynamicContextMenuHandler(HKEY hKey, const CLSID * pClass, BOOL bExternalInit)
 {
   HRESULT hr;
   IContextMenu * cmobj;
   IShellExtInit *shext;
   PDynamicShellEntry curEntry;
-  //WCHAR szTemp[100];
   LPOLESTR pstr;
 
-  StringFromCLSID(*szClass, &pstr);
+  StringFromCLSID(*pClass, &pstr);
 
-  TRACE("SH_LoadDynamicContextMenuHandler entered with This %p hKey %p szClass %s bExternalInit %u\n",this, hKey, wine_dbgstr_guid(szClass), bExternalInit);
-  //swprintf(szTemp, L"This %p hKey %p szClass %s bExternalInit %u", this, hKey, pstr, bExternalInit);
-  //MessageBoxW(NULL, szTemp, NULL, MB_OK);
+  TRACE("SH_LoadDynamicContextMenuHandler entered with This %p hKey %p pClass %s bExternalInit %u\n", this, hKey, wine_dbgstr_guid(pClass), bExternalInit);
 
-  if (IsShellExtensionAlreadyLoaded(szClass))
+  if (IsShellExtensionAlreadyLoaded(pClass))
       return S_OK;
 
-  hr = SHCoCreateInstance(NULL, szClass, NULL, IID_IContextMenu, (void**)&cmobj);
+  hr = SHCoCreateInstance(NULL, pClass, NULL, IID_IContextMenu, (void**)&cmobj);
   if (hr != S_OK)
   {
-      TRACE("SHCoCreateInstance failed %x\n", GetLastError());
+      ERR("SHCoCreateInstance failed %x\n", GetLastError());
       return hr;
   }
 
@@ -368,7 +366,7 @@ IDefaultContextMenuImpl::SH_LoadDynamicContextMenuHandler(HKEY hKey, const CLSID
       hr = cmobj->QueryInterface(IID_IShellExtInit, (void**)&shext);
       if (hr != S_OK)
       {
-        TRACE("Failed to query for interface IID_IShellExtInit\n");
+        ERR("Failed to query for interface IID_IShellExtInit hr %x pClass %s\n", hr, wine_dbgstr_guid(pClass));
         cmobj->Release();
         return FALSE;
       }
@@ -376,7 +374,7 @@ IDefaultContextMenuImpl::SH_LoadDynamicContextMenuHandler(HKEY hKey, const CLSID
       shext->Release();
       if (hr != S_OK)
       {
-        TRACE("Failed to initialize shell extension error %x\n", hr);
+        TRACE("Failed to initialize shell extension error %x pClass %s\n", hr, wine_dbgstr_guid(pClass));
         cmobj->Release();
         return hr;
       }
@@ -393,7 +391,7 @@ IDefaultContextMenuImpl::SH_LoadDynamicContextMenuHandler(HKEY hKey, const CLSID
   curEntry->Next = NULL;
   curEntry->NumIds = 0;
   curEntry->CMenu = cmobj;
-  memcpy(&curEntry->ClassID, szClass, sizeof(CLSID));
+  memcpy(&curEntry->ClassID, pClass, sizeof(CLSID));
 
   if (dhead)
   {
@@ -660,7 +658,7 @@ IDefaultContextMenuImpl::AddStaticContextMenusToMenu(
             }
             else
             {
-                TRACE("Failed to load string, defaulting to NULL value for mii.dwTypeData\n");
+                ERR("Failed to load string, defaulting to NULL value for mii.dwTypeData\n");
             }
         }
         else
@@ -728,7 +726,7 @@ void WINAPI _InsertMenuItemW (
             }
             else
             {
-                TRACE("failed to load string %p\n", dwTypeData);
+                ERR("failed to load string %p\n", dwTypeData);
                 return;
             }
         }
@@ -766,9 +764,11 @@ IDefaultContextMenuImpl::BuildShellItemContextMenu(
 
     TRACE("BuildShellItemContextMenu entered\n");
 
-    if (dcm.psf->GetDisplayNameOf(dcm.apidl[0], SHGDN_FORPARSING, &strFile) == S_OK)
+    hr = dcm.psf->GetDisplayNameOf(dcm.apidl[0], SHGDN_FORPARSING, &strFile);
+    if (hr == S_OK)
     {
-        if (StrRetToBufW(&strFile, dcm.apidl[0], szPath, MAX_PATH) == S_OK)
+        hr = StrRetToBufW(&strFile, dcm.apidl[0], szPath, MAX_PATH);
+        if (hr == S_OK)
         {
             pOffset = wcsrchr(szPath, L'.');
             if (pOffset)
@@ -803,6 +803,8 @@ IDefaultContextMenuImpl::BuildShellItemContextMenu(
             }
         }
     }
+    else
+        ERR("GetDisplayNameOf failed: %x\n", hr);
 
     guid = _ILGetGUIDPointer(dcm.apidl[0]);
     if (guid)
@@ -841,10 +843,13 @@ IDefaultContextMenuImpl::BuildShellItemContextMenu(
     /* add static actions */
     rfg = SFGAO_BROWSABLE | SFGAO_CANCOPY | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANDELETE | SFGAO_CANRENAME | SFGAO_HASPROPSHEET | SFGAO_FILESYSTEM | SFGAO_FOLDER;
     hr = dcm.psf->GetAttributesOf(dcm.cidl, dcm.apidl, &rfg);
-    if (!SUCCEEDED(hr))
+    if (FAILED(hr))
+    {
+        WARN("GetAttributesOf failed: %x\n", hr);
         rfg = 0;
+    }
 
-    if (rfg & SFGAO_FOLDER)
+    if ((rfg & SFGAO_FOLDER) || _ILIsControlPanel(dcm.apidl[dcm.cidl]))
     {
         /* add the default verbs open / explore */
         SH_AddStaticEntryForFileClass(L"Folder");
@@ -1156,8 +1161,7 @@ HRESULT
 IDefaultContextMenuImpl::DoOpenOrExplore(
     LPCMINVOKECOMMANDINFO lpcmi)
 {
-
-
+    UNIMPLEMENTED;
     return E_FAIL;
 }
 
@@ -1450,7 +1454,7 @@ IDefaultContextMenuImpl::DoProperties(
     {
         //FIXME path!
         ShellExecuteW(NULL, L"open", L"explorer.exe",
-                      L"/n,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{7007ACC7-3202-11D1-AAD2-00805FC1270E}", 
+                      L"::{7007ACC7-3202-11D1-AAD2-00805FC1270E}", 
                       NULL, SW_SHOWDEFAULT);
         return S_OK;
     }
@@ -1697,7 +1701,7 @@ SHCreateDefaultContextMenu(
 
    *ppv = NULL;
    hr = IDefaultContextMenu_Constructor( pdcm, riid, ppv );
-
+   if (FAILED(hr)) WARN("IDefaultContextMenu_Constructor failed: %x\n", hr);
    TRACE("pcm %p hr %x\n", pdcm, hr);
    return hr;
 }