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.…
==============================================================================
--- 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?r…
==============================================================================
--- 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/…
==============================================================================
--- 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
'(a)%%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/…
==============================================================================
--- 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_ocme…
==============================================================================
--- 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_…
==============================================================================
--- 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_a…
==============================================================================
--- 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_c…
==============================================================================
--- 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_f…
==============================================================================
--- 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_m…
==============================================================================
--- 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_p…
==============================================================================
--- 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/shlfolde…
==============================================================================
--- 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.…
==============================================================================
--- 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_…
==============================================================================
--- 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;
}