diff --git a/reactos/dll/win32/shell32/classes.cpp b/reactos/dll/win32/shell32/classes.cpp index fe69656db94..0c4debb9c67 100644 --- a/reactos/dll/win32/shell32/classes.cpp +++ b/reactos/dll/win32/shell32/classes.cpp @@ -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; } diff --git a/reactos/dll/win32/shell32/pidl.cpp b/reactos/dll/win32/shell32/pidl.cpp index c0fedee795a..ce65e6df80f 100644 --- a/reactos/dll/win32/shell32/pidl.cpp +++ b/reactos/dll/win32/shell32/pidl.cpp @@ -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) diff --git a/reactos/dll/win32/shell32/pidl.h b/reactos/dll/win32/shell32/pidl.h index 2ba343c5da6..1de0707c42b 100644 --- a/reactos/dll/win32/shell32/pidl.h +++ b/reactos/dll/win32/shell32/pidl.h @@ -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 diff --git a/reactos/dll/win32/shell32/res/rgs/controlpanel.rgs b/reactos/dll/win32/shell32/res/rgs/controlpanel.rgs index 298ff87c917..396b583d482 100644 --- a/reactos/dll/win32/shell32/res/rgs/controlpanel.rgs +++ b/reactos/dll/win32/shell32/res/rgs/controlpanel.rgs @@ -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 '' } diff --git a/reactos/dll/win32/shell32/res/rgs/fontsfoldershortcut.rgs b/reactos/dll/win32/shell32/res/rgs/fontsfoldershortcut.rgs index 69591c6644f..5ab751d1342 100644 --- a/reactos/dll/win32/shell32/res/rgs/fontsfoldershortcut.rgs +++ b/reactos/dll/win32/shell32/res/rgs/fontsfoldershortcut.rgs @@ -23,7 +23,7 @@ HKCR } 'ShellFolder' { - val Attributes = d '&H60000100' + val Attributes = d '&H60000000' val WantsFORPARSING = s '' } } diff --git a/reactos/dll/win32/shell32/she_ocmenu.cpp b/reactos/dll/win32/shell32/she_ocmenu.cpp index 62f17e79cda..e39fabba79f 100644 --- a/reactos/dll/win32/shell32/she_ocmenu.cpp +++ b/reactos/dll/win32/shell32/she_ocmenu.cpp @@ -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; diff --git a/reactos/dll/win32/shell32/shell32_main.cpp b/reactos/dll/win32/shell32/shell32_main.cpp index d76d27bc353..4a9ec2de30e 100644 --- a/reactos/dll/win32/shell32/shell32_main.cpp +++ b/reactos/dll/win32/shell32/shell32_main.cpp @@ -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; } /************************************************************************* diff --git a/reactos/dll/win32/shell32/shfldr_admintools.cpp b/reactos/dll/win32/shell32/shfldr_admintools.cpp index 8c056c6e0b5..e83cf233248 100644 --- a/reactos/dll/win32/shell32/shfldr_admintools.cpp +++ b/reactos/dll/win32/shell32/shfldr_admintools.cpp @@ -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)) diff --git a/reactos/dll/win32/shell32/shfldr_cpanel.cpp b/reactos/dll/win32/shell32/shfldr_cpanel.cpp index 0f9b07be130..132b67535ca 100644 --- a/reactos/dll/win32/shell32/shfldr_cpanel.cpp +++ b/reactos/dll/win32/shell32/shfldr_cpanel.cpp @@ -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; - - 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,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; diff --git a/reactos/dll/win32/shell32/shfldr_fonts.cpp b/reactos/dll/win32/shell32/shfldr_fonts.cpp index 50a849f2d78..25c5497b9d9 100644 --- a/reactos/dll/win32/shell32/shfldr_fonts.cpp +++ b/reactos/dll/win32/shell32/shfldr_fonts.cpp @@ -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,17 +444,39 @@ HRESULT WINAPI CFontsFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, 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; } diff --git a/reactos/dll/win32/shell32/shfldr_mycomp.cpp b/reactos/dll/win32/shell32/shfldr_mycomp.cpp index 076c6cb05ed..f66b926e834 100644 --- a/reactos/dll/win32/shell32/shfldr_mycomp.cpp +++ b/reactos/dll/win32/shell32/shfldr_mycomp.cpp @@ -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++; diff --git a/reactos/dll/win32/shell32/shfldr_printers.cpp b/reactos/dll/win32/shell32/shfldr_printers.cpp index 05650aa716f..cef7de1c044 100644 --- a/reactos/dll/win32/shell32/shfldr_printers.cpp +++ b/reactos/dll/win32/shell32/shfldr_printers.cpp @@ -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) diff --git a/reactos/dll/win32/shell32/shlfolder.cpp b/reactos/dll/win32/shell32/shlfolder.cpp index c142374926f..91cf528d36a 100644 --- a/reactos/dll/win32/shell32/shlfolder.cpp +++ b/reactos/dll/win32/shell32/shlfolder.cpp @@ -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) { diff --git a/reactos/dll/win32/shell32/shlview.cpp b/reactos/dll/win32/shell32/shlview.cpp index a2661b5b554..daee376ce1c 100644 --- a/reactos/dll/win32/shell32/shlview.cpp +++ b/reactos/dll/win32/shell32/shlview.cpp @@ -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; diff --git a/reactos/dll/win32/shell32/shv_def_cmenu.cpp b/reactos/dll/win32/shell32/shv_def_cmenu.cpp index 61fcc495fd7..06a4a8baef4 100644 --- a/reactos/dll/win32/shell32/shv_def_cmenu.cpp +++ b/reactos/dll/win32/shell32/shv_def_cmenu.cpp @@ -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; }