Author: rharabien Date: Sat Dec 17 22:48:16 2011 New Revision: 54673
URL: http://svn.reactos.org/svn/reactos?rev=54673&view=rev Log: [SHELL32] - 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
Modified: trunk/reactos/dll/win32/shell32/classes.cpp trunk/reactos/dll/win32/shell32/pidl.cpp trunk/reactos/dll/win32/shell32/pidl.h trunk/reactos/dll/win32/shell32/res/rgs/controlpanel.rgs trunk/reactos/dll/win32/shell32/res/rgs/fontsfoldershortcut.rgs trunk/reactos/dll/win32/shell32/she_ocmenu.cpp trunk/reactos/dll/win32/shell32/shell32_main.cpp trunk/reactos/dll/win32/shell32/shfldr_admintools.cpp trunk/reactos/dll/win32/shell32/shfldr_cpanel.cpp trunk/reactos/dll/win32/shell32/shfldr_fonts.cpp trunk/reactos/dll/win32/shell32/shfldr_mycomp.cpp trunk/reactos/dll/win32/shell32/shfldr_printers.cpp trunk/reactos/dll/win32/shell32/shlfolder.cpp trunk/reactos/dll/win32/shell32/shlview.cpp trunk/reactos/dll/win32/shell32/shv_def_cmenu.cpp
Modified: trunk/reactos/dll/win32/shell32/classes.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/classes.c... ============================================================================== --- trunk/reactos/dll/win32/shell32/classes.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/classes.cpp [iso-8859-1] Sat Dec 17 22:48:16 2011 @@ -324,7 +324,7 @@
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 @@ { 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 @@ if(LoadStringW(shell32_hInstance, IDS_ADMINISTRATIVETOOLS, szDest, buflen)) ret = TRUE; } - - } + } + TRACE("-- %s\n", debugstr_w(szDest)); return ret; }
Modified: trunk/reactos/dll/win32/shell32/pidl.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/pidl.cpp?... ============================================================================== --- trunk/reactos/dll/win32/shell32/pidl.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/pidl.cpp [iso-8859-1] Sat Dec 17 22:48:16 2011 @@ -1222,11 +1222,17 @@ 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 @@ { TRACE("(%p)\n",pidl);
- return pidl && pidl->mkid.cb ? 0 : 1; + return pidl && pidl->mkid.cb ? 0 : 1; }
BOOL _ILIsMyDocuments(LPCITEMIDLIST pidl)
Modified: trunk/reactos/dll/win32/shell32/pidl.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/pidl.h?re... ============================================================================== --- trunk/reactos/dll/win32/shell32/pidl.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/pidl.h [iso-8859-1] Sat Dec 17 22:48:16 2011 @@ -104,6 +104,7 @@ #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
Modified: trunk/reactos/dll/win32/shell32/res/rgs/controlpanel.rgs URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/res/rgs/c... ============================================================================== --- trunk/reactos/dll/win32/shell32/res/rgs/controlpanel.rgs [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/res/rgs/controlpanel.rgs [iso-8859-1] Sat Dec 17 22:48:16 2011 @@ -2,7 +2,7 @@ { 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 @@ } ShellFolder { - val Attributes = d '0' + val Attributes = d '&H00000000' val HideAsDeletePerUser = s '' val WantsFORDISPLAY = s '' }
Modified: trunk/reactos/dll/win32/shell32/res/rgs/fontsfoldershortcut.rgs URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/res/rgs/f... ============================================================================== --- trunk/reactos/dll/win32/shell32/res/rgs/fontsfoldershortcut.rgs [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/res/rgs/fontsfoldershortcut.rgs [iso-8859-1] Sat Dec 17 22:48:16 2011 @@ -23,7 +23,7 @@ } 'ShellFolder' { - val Attributes = d '&H60000100' + val Attributes = d '&H60000000' val WantsFORPARSING = s '' } }
Modified: trunk/reactos/dll/win32/shell32/she_ocmenu.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/she_ocmen... ============================================================================== --- trunk/reactos/dll/win32/shell32/she_ocmenu.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/she_ocmenu.cpp [iso-8859-1] Sat Dec 17 22:48:16 2011 @@ -153,12 +153,11 @@ HMENU hSubMenu = NULL; OPEN_WITH_CONTEXT Context;
- if (LoadStringW(shell32_hInstance, IDS_OPEN_WITH, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)) < 0) - { - TRACE("failed to load string\n"); + if (!LoadStringW(shell32_hInstance, IDS_OPEN_WITH, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) + { + ERR("failed to load string\n"); return E_FAIL; } - szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
hSubMenu = CreatePopupMenu();
@@ -798,7 +797,7 @@ 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 @@
/* 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 @@ 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 @@ /* open mru list */ hList = OpenMRUList(hKey); if (!hList) - return; + { + ERR("OpenMRUList failed\n"); + return; + }
/* get list count */ nCount = EnumMRUListW(hList, -1, NULL, 0); @@ -933,11 +933,11 @@
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 @@ 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 @@ return hr; }
- /*assert(pida->cidl==1);*/ pida = (LPIDA)GlobalLock(medium.hGlobal); - - pidl_folder = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[0]); - pidl_child = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[1]); + ASSERT(pida->cidl==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 @@ 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 @@
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)) - { - TRACE("path is a executable %x\n", dwPath); + if (GetBinaryTypeW(szPath, &dwType)) + { + TRACE("path is a executable %x\n", dwType); return E_FAIL; }
- szPtr = wcsrchr(szPath, '.'); - if (szPtr) - { - if (!_wcsicmp(szPtr, szShortCut)) - { - FIXME("pidl is a shortcut\n"); - return E_FAIL; - } - } + pszExt = wcsrchr(szPath, L'.'); + if (pszExt && !_wcsicmp(pszExt, szShortCut)) + { + 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 @@ return SHEOW_LoadOpenWithItems(pdtobj); }
-HRESULT WINAPI SHOpenWithDialog( - HWND hwndParent, - const OPENASINFO *poainfo -) +HRESULT WINAPI +SHOpenWithDialog(HWND hwndParent, + const OPENASINFO *poainfo) { MSG msg; BOOL bRet;
Modified: trunk/reactos/dll/win32/shell32/shell32_main.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shell32_m... ============================================================================== --- trunk/reactos/dll/win32/shell32/shell32_main.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/shell32_main.cpp [iso-8859-1] Sat Dec 17 22:48:16 2011 @@ -1462,8 +1462,11 @@ 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 @@ if (FAILED(hr)) return hr;
- // extra stuff which is performed for IShellFolder - return DoUnregisterServer(); + return S_OK; }
/*************************************************************************
Modified: trunk/reactos/dll/win32/shell32/shfldr_admintools.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shfldr_ad... ============================================================================== --- trunk/reactos/dll/win32/shell32/shfldr_admintools.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/shfldr_admintools.cpp [iso-8859-1] Sat Dec 17 22:48:16 2011 @@ -365,9 +365,9 @@ if (!pszPath) return E_OUTOFMEMORY;
- ZeroMemory(pszPath, (MAX_PATH +1) * sizeof(WCHAR)); - - if (_ILIsAdminTools (pidl)) + ZeroMemory(pszPath, (MAX_PATH + 1) * sizeof(WCHAR)); + + if (!pidl->mkid.cb) { if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) && (GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING))
Modified: trunk/reactos/dll/win32/shell32/shfldr_cpanel.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shfldr_cp... ============================================================================== --- trunk/reactos/dll/win32/shell32/shfldr_cpanel.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/shfldr_cpanel.cpp [iso-8859-1] Sat Dec 17 22:48:16 2011 @@ -480,13 +480,14 @@ return E_INVALIDARG;
if (*rgfInOut == 0) - *rgfInOut = ~0; - - while(cidl > 0 && *apidl) { - pdump(*apidl); - SHELL32_GetItemAttributes(this, *apidl, rgfInOut); - apidl++; - cidl--; + *rgfInOut = ~0; + + 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 @@ 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 @@ 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; - - PathAddBackslashW(wszName); - len = 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 (dwFlags & SHGDN_FORPARSING) { - if (!WideCharToMultiByte(CP_ACP, 0, wszName, -1, szName, MAX_PATH, NULL, NULL)) - wszName[0] = '\0'; + /* go deeper if needed */ + int cchName; + + PathAddBackslashW(wszName); + cchName = wcslen(wszName); + + 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,14 +798,9 @@ 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 @@ return E_INVALIDARG; if (StringFromCLSID(*iid, &pOleStr) == S_OK) { - hr = ExecuteAppletFromCLSID(pOleStr); CoTaskMemFree(pOleStr); return hr;
Modified: trunk/reactos/dll/win32/shell32/shfldr_fonts.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shfldr_fo... ============================================================================== --- trunk/reactos/dll/win32/shell32/shfldr_fonts.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/shfldr_fonts.cpp [iso-8859-1] Sat Dec 17 22:48:16 2011 @@ -436,7 +436,7 @@ */ 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 @@ if (!strRet) return E_INVALIDARG;
- pfont = _ILGetFontStruct(pidl); - if (!pfont) + pFont = _ILGetFontStruct(pidl); + if (pFont) + { + 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]; + + 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; - - 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;
return S_OK; }
Modified: trunk/reactos/dll/win32/shell32/shfldr_mycomp.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shfldr_my... ============================================================================== --- trunk/reactos/dll/win32/shell32/shfldr_mycomp.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/shfldr_mycomp.cpp [iso-8859-1] Sat Dec 17 22:48:16 2011 @@ -136,11 +136,12 @@ 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 @@ { 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 @@ 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++;
Modified: trunk/reactos/dll/win32/shell32/shfldr_printers.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shfldr_pr... ============================================================================== --- trunk/reactos/dll/win32/shell32/shfldr_printers.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/shfldr_printers.cpp [iso-8859-1] Sat Dec 17 22:48:16 2011 @@ -561,7 +561,7 @@ return E_INVALIDARG; }
- if (_ILIsPrinter(pidl)) + if (!pidl->mkid.cb) { pszName = (LPWSTR)CoTaskMemAlloc(MAX_PATH * sizeof(WCHAR)); if (!pszName)
Modified: trunk/reactos/dll/win32/shell32/shlfolder.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shlfolder... ============================================================================== --- trunk/reactos/dll/win32/shell32/shlfolder.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/shlfolder.cpp [iso-8859-1] Sat Dec 17 22:48:16 2011 @@ -318,25 +318,28 @@ TRACE ("(%p)->(pidl=%p 0x%08x %p 0x%08x)\n", psf, pidl, dwFlags, szOut, dwOutLen); pdump (pidl);
- pidlFirst = ILCloneFirst (pidl); - if (pidlFirst) { - IShellFolder2 *psfChild; - - 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)) + 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 = psfChild->GetDisplayNameOf(pidlNext, dwFlags, &strTemp); + if (SUCCEEDED (hr)) + { + if(!StrRetToStrNW (szOut, dwOutLen, &strTemp, pidlNext)) hr = E_FAIL; - } - psfChild->Release(); - } - ILFree (pidlFirst); + } + psfChild->Release(); + } + ILFree (pidlFirst); } else - hr = E_OUTOFMEMORY; + hr = E_OUTOFMEMORY;
TRACE ("-- ret=0x%08x %s\n", hr, debugstr_w(szOut));
@@ -394,13 +397,20 @@
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 @@ } }
- /* 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) {
Modified: trunk/reactos/dll/win32/shell32/shlview.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shlview.c... ============================================================================== --- trunk/reactos/dll/win32/shell32/shlview.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/shlview.cpp [iso-8859-1] Sat Dec 17 22:48:16 2011 @@ -1131,13 +1131,18 @@ 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 @@ { CF_IDLIST = RegisterClipboardFormatW(CFSTR_SHELLIDLIST); } - + fetc.cfFormat = CF_IDLIST; fetc.ptd = NULL; fetc.dwAspect = DVASPECT_CONTENT;
Modified: trunk/reactos/dll/win32/shell32/shv_def_cmenu.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shv_def_c... ============================================================================== --- trunk/reactos/dll/win32/shell32/shv_def_cmenu.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/shv_def_cmenu.cpp [iso-8859-1] Sat Dec 17 22:48:16 2011 @@ -309,6 +309,7 @@ return ret; }
+static VOID DisablePasteOptions(HMENU hMenu) { @@ -338,28 +339,25 @@
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); - - 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); - - if (IsShellExtensionAlreadyLoaded(szClass)) + StringFromCLSID(*pClass, &pstr); + + TRACE("SH_LoadDynamicContextMenuHandler entered with This %p hKey %p pClass %s bExternalInit %u\n", this, hKey, wine_dbgstr_guid(pClass), bExternalInit); + + 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 @@ 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 @@ 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 @@ 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 @@ } 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 @@ } else { - TRACE("failed to load string %p\n", dwTypeData); + ERR("failed to load string %p\n", dwTypeData); return; } } @@ -766,9 +764,11 @@
TRACE("BuildShellItemContextMenu entered\n");
- if (dcm.psf->GetDisplayNameOf(dcm.apidl[0], SHGDN_FORPARSING, &strFile) == S_OK) - { - if (StrRetToBufW(&strFile, dcm.apidl[0], szPath, MAX_PATH) == S_OK) + hr = dcm.psf->GetDisplayNameOf(dcm.apidl[0], SHGDN_FORPARSING, &strFile); + if (hr == 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 @@ } } } + else + ERR("GetDisplayNameOf failed: %x\n", hr);
guid = _ILGetGUIDPointer(dcm.apidl[0]); if (guid) @@ -841,10 +843,13 @@ /* 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 @@ IDefaultContextMenuImpl::DoOpenOrExplore( LPCMINVOKECOMMANDINFO lpcmi) { - - + UNIMPLEMENTED; return E_FAIL; }
@@ -1450,7 +1454,7 @@ { //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 @@
*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; }