[SHELL32]
authorGiannis Adamopoulos <gadamopoulos@reactos.org>
Sun, 2 Oct 2016 13:22:01 +0000 (13:22 +0000)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Sun, 2 Oct 2016 13:22:01 +0000 (13:22 +0000)
- CNetFolder: Use the Folder class for the items shown. The same is done in shell extensions (in windows) that use the CDefaultContextMenu and want the Open and Explore verbs to be shown. This behaviour was first discovered by gigaherz when ntobjshex was tested in windows.
CORE-12086

svn path=/trunk/; revision=72891

reactos/dll/win32/shell32/folders/CNetFolder.cpp
reactos/dll/win32/shell32/shfldr.h
reactos/dll/win32/shell32/shlfolder.cpp

index 81e3a99..d0a9d3c 100644 (file)
@@ -417,8 +417,11 @@ HRESULT WINAPI CNetFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CH
 
     if (IsEqualIID(riid, IID_IContextMenu) && (cidl >= 1))
     {
-        IContextMenu  * pCm = NULL;
-        hr = CDefFolderMenu_Create2(pidlRoot, hwndOwner, cidl, apidl, static_cast<IShellFolder*>(this), NULL, 0, NULL, &pCm);
+        IContextMenu * pCm = NULL;
+        HKEY hkey;
+        UINT cKeys = 0;
+        AddClassKeyToArray(L"Folder", &hkey, &cKeys);
+        hr = CDefFolderMenu_Create2(pidlRoot, hwndOwner, cidl, apidl, static_cast<IShellFolder*>(this), NULL, cKeys, &hkey, &pCm);
         pObj = pCm;
     }
     else if (IsEqualIID(riid, IID_IDataObject) && (cidl >= 1))
index 54ed1b4..a8543e6 100644 (file)
@@ -83,6 +83,8 @@ static __inline int SHELL32_GUIDToStringW (REFGUID guid, LPWSTR str)
 void SHELL_FS_ProcessDisplayFilename(LPWSTR szPath, DWORD dwFlags);
 BOOL SHELL_FS_HideExtension(LPWSTR pwszPath);
 
+void AddClassKeyToArray(const WCHAR * szClass, HKEY* array, UINT* cKeys);
+
 #ifdef __cplusplus
 
 HRESULT inline SHSetStrRet(LPSTRRET pStrRet, DWORD resId)
index d632fb0..cf1987c 100644 (file)
@@ -462,6 +462,20 @@ HRESULT SHELL32_CompareDetails(IShellFolder2* isf, LPARAM lParam, LPCITEMIDLIST
     return MAKE_COMPARE_HRESULT(ret);
 }
 
+void AddClassKeyToArray(const WCHAR * szClass, HKEY* array, UINT* cKeys)
+{
+    if (*cKeys >= 16)
+        return;
+
+    HKEY hkey;
+    LSTATUS result = RegOpenKeyExW(HKEY_CLASSES_ROOT, szClass, 0, KEY_READ | KEY_QUERY_VALUE, &hkey);
+    if (result != ERROR_SUCCESS)
+        return;
+
+    array[*cKeys] = hkey;
+    *cKeys += 1;
+}
+
 /***********************************************************************
  *  SHCreateLinks
  *