[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

svn path=/trunk/; revision=54673
This commit is contained in:
Rafal Harabien 2011-12-17 22:48:16 +00:00
parent 4e9b968c96
commit 7a0ad93bff
15 changed files with 205 additions and 155 deletions

View file

@ -324,7 +324,7 @@ static const WCHAR swEmpty[] = {0};
BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len) BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len)
{ {
HKEY hkey; HKEY hkey;
BOOL ret = FALSE; BOOL ret = FALSE;
DWORD buflen = len; DWORD buflen = len;
WCHAR szName[100]; WCHAR szName[100];
@ -346,8 +346,8 @@ BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len)
{ {
static const WCHAR wszLocalizedString[] = static const WCHAR wszLocalizedString[] =
{ 'L','o','c','a','l','i','z','e','d','S','t','r','i','n','g', 0 }; { '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) || if (RegLoadMUIStringW(hkey, wszLocalizedString, szDest, len, NULL, 0, NULL) == ERROR_SUCCESS ||
!RegQueryValueExW(hkey, swEmpty, 0, NULL, (LPBYTE)szDest, &len)) !RegQueryValueExW(hkey, swEmpty, 0, NULL, (LPBYTE)szDest, &len) == ERROR_SUCCESS)
{ {
ret = TRUE; ret = TRUE;
} }
@ -386,8 +386,8 @@ BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len)
if(LoadStringW(shell32_hInstance, IDS_ADMINISTRATIVETOOLS, szDest, buflen)) if(LoadStringW(shell32_hInstance, IDS_ADMINISTRATIVETOOLS, szDest, buflen))
ret = TRUE; ret = TRUE;
} }
} }
TRACE("-- %s\n", debugstr_w(szDest)); TRACE("-- %s\n", debugstr_w(szDest));
return ret; return ret;
} }

View file

@ -1222,11 +1222,17 @@ BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
return FALSE; return FALSE;
hr = SHBindToParent(pidl, IID_IShellFolder, (VOID**)&psfFolder, &pidlLast); 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; dwAttributes = SFGAO_FILESYSTEM;
hr = psfFolder->GetAttributesOf(1, &pidlLast, &dwAttributes); 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; return FALSE;
} }
@ -1592,7 +1598,7 @@ BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
{ {
TRACE("(%p)\n",pidl); TRACE("(%p)\n",pidl);
return pidl && pidl->mkid.cb ? 0 : 1; return pidl && pidl->mkid.cb ? 0 : 1;
} }
BOOL _ILIsMyDocuments(LPCITEMIDLIST pidl) BOOL _ILIsMyDocuments(LPCITEMIDLIST pidl)

View file

@ -104,6 +104,7 @@
#define PT_NETWORK 0x47 #define PT_NETWORK 0x47
#define PT_IESPECIAL1 0x61 #define PT_IESPECIAL1 0x61
#define PT_YAGUID 0x70 /* yet another guid.. */ #define PT_YAGUID 0x70 /* yet another guid.. */
#define PT_CPEXT 0x71
#define PT_IESPECIAL2 0xb1 #define PT_IESPECIAL2 0xb1
#define PT_SHARE 0xc3 #define PT_SHARE 0xc3

View file

@ -2,7 +2,7 @@ HKCR
{ {
NoRemove CLSID 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' val InfoTip = e '@%%SystemRoot%%\system32\SHELL32.dll,-31361'
DefaultIcon = e '%%SystemRoot%%\System32\shell32.dll,-137' DefaultIcon = e '%%SystemRoot%%\System32\shell32.dll,-137'
@ -12,7 +12,7 @@ HKCR
} }
ShellFolder ShellFolder
{ {
val Attributes = d '0' val Attributes = d '&H00000000'
val HideAsDeletePerUser = s '' val HideAsDeletePerUser = s ''
val WantsFORDISPLAY = s '' val WantsFORDISPLAY = s ''
} }

View file

@ -23,7 +23,7 @@ HKCR
} }
'ShellFolder' 'ShellFolder'
{ {
val Attributes = d '&H60000100' val Attributes = d '&H60000000'
val WantsFORPARSING = s '' val WantsFORPARSING = s ''
} }
} }

View file

@ -153,12 +153,11 @@ HRESULT WINAPI COpenWithMenu::QueryContextMenu(
HMENU hSubMenu = NULL; HMENU hSubMenu = NULL;
OPEN_WITH_CONTEXT Context; 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; return E_FAIL;
} }
szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
hSubMenu = CreatePopupMenu(); hSubMenu = CreatePopupMenu();
@ -798,7 +797,7 @@ InsertOpenWithItem(POPEN_WITH_CONTEXT pContext, WCHAR * szAppName)
MENUITEMINFOW mii; MENUITEMINFOW mii;
POPEN_ITEM_CONTEXT pItemContext; POPEN_ITEM_CONTEXT pItemContext;
LRESULT index; LRESULT index;
WCHAR * Offset; WCHAR *pwszExt;
WCHAR Buffer[_MAX_FNAME]; WCHAR Buffer[_MAX_FNAME];
pItemContext = (OPEN_ITEM_CONTEXT *)HeapAlloc(GetProcessHeap(), 0, sizeof(OPEN_ITEM_CONTEXT)); 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 */ /* store app path */
wcscpy(pItemContext->szAppName, szAppName); wcscpy(pItemContext->szAppName, szAppName);
/* null terminate it */
pItemContext->szAppName[MAX_PATH-1] = 0;
/* extract path name */ /* extract path name */
_wsplitpath(szAppName, NULL, NULL, Buffer, NULL); _wsplitpath(szAppName, NULL, NULL, Buffer, NULL);
Offset = wcsrchr(Buffer, '.'); pwszExt = wcsrchr(Buffer, '.');
if (Offset) if (pwszExt)
Offset[0] = L'\0'; pwszExt[0] = L'\0';
Buffer[0] = towupper(Buffer[0]); Buffer[0] = towupper(Buffer[0]);
if (pContext->bMenu) if (pContext->bMenu)
@ -840,7 +837,7 @@ InsertOpenWithItem(POPEN_WITH_CONTEXT pContext, WCHAR * szAppName)
pItemContext->hIcon = ExtractIconW(shell32_hInstance, szAppName, 0); pItemContext->hIcon = ExtractIconW(shell32_hInstance, szAppName, 0);
/* get manufacturer */ /* get manufacturer */
GetManufacturer(pItemContext->szAppName, pItemContext); 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) if (index != LB_ERR)
SendMessageW(pContext->hDlgCtrl, LB_SETITEMDATA, index, (LPARAM)pItemContext); SendMessageW(pContext->hDlgCtrl, LB_SETITEMDATA, index, (LPARAM)pItemContext);
} }
@ -879,7 +876,10 @@ AddItemFromMRUList(POPEN_WITH_CONTEXT pContext, HKEY hKey)
/* open mru list */ /* open mru list */
hList = OpenMRUList(hKey); hList = OpenMRUList(hKey);
if (!hList) if (!hList)
{
ERR("OpenMRUList failed\n");
return; return;
}
/* get list count */ /* get list count */
nCount = EnumMRUListW(hList, -1, NULL, 0); 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) if (RegGetValueW(hSubKey, NULL, NULL, RRF_RT_REG_SZ, NULL, (PVOID)szBuffer, &dwBuffer) == ERROR_SUCCESS)
{ {
WCHAR * Ext = wcsrchr(szBuffer, ' '); WCHAR * pszSpace = wcsrchr(szBuffer, ' ');
if (Ext) if (pszSpace)
{ {
/* erase %1 or extra arguments */ /* erase %1 or extra arguments */
Ext[0] = 0; *pszSpace = 0; // FIXME: what about '"'
} }
if(!HideApplicationFromList(szBuffer)) if(!HideApplicationFromList(szBuffer))
InsertOpenWithItem(pContext, szBuffer); InsertOpenWithItem(pContext, szBuffer);
@ -1022,8 +1022,8 @@ COpenWithMenu::SHEOW_LoadOpenWithItems(IDataObject *pdtobj)
LPCITEMIDLIST pidl_folder; LPCITEMIDLIST pidl_folder;
LPCITEMIDLIST pidl_child; LPCITEMIDLIST pidl_child;
LPCITEMIDLIST pidl; LPCITEMIDLIST pidl;
DWORD dwPath; DWORD dwType;
LPWSTR szPtr; LPWSTR pszExt;
static const WCHAR szShortCut[] = { '.','l','n','k', 0 }; static const WCHAR szShortCut[] = { '.','l','n','k', 0 };
fmt.cfFormat = RegisterClipboardFormatW(CFSTR_SHELLIDLIST); fmt.cfFormat = RegisterClipboardFormatW(CFSTR_SHELLIDLIST);
@ -1040,11 +1040,11 @@ COpenWithMenu::SHEOW_LoadOpenWithItems(IDataObject *pdtobj)
return hr; return hr;
} }
/*assert(pida->cidl==1);*/
pida = (LPIDA)GlobalLock(medium.hGlobal); pida = (LPIDA)GlobalLock(medium.hGlobal);
ASSERT(pida->cidl==1);
pidl_folder = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[0]); pidl_folder = (LPCITEMIDLIST) ((LPBYTE)pida + pida->aoffset[0]);
pidl_child = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[1]); pidl_child = (LPCITEMIDLIST) ((LPBYTE)pida + pida->aoffset[1]);
pidl = ILCombine(pidl_folder, pidl_child); pidl = ILCombine(pidl_folder, pidl_child);
@ -1057,7 +1057,7 @@ COpenWithMenu::SHEOW_LoadOpenWithItems(IDataObject *pdtobj)
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
} }
if (_ILIsDesktop(pidl) || _ILIsMyDocuments(pidl) || _ILIsControlPanel(pidl) || _ILIsNetHood(pidl) || 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"); TRACE("pidl is a folder\n");
SHFree((void*)pidl); SHFree((void*)pidl);
@ -1066,35 +1066,35 @@ COpenWithMenu::SHEOW_LoadOpenWithItems(IDataObject *pdtobj)
if (!SHGetPathFromIDListW(pidl, szPath)) if (!SHGetPathFromIDListW(pidl, szPath))
{ {
IID *iid = _ILGetGUIDPointer(pidl);
SHFree((void*)pidl); SHFree((void*)pidl);
ERR("SHGetPathFromIDListW failed\n"); ERR("SHGetPathFromIDListW failed %s\n", iid ? shdebugstr_guid(iid) : "");
return E_FAIL; return E_FAIL;
} }
SHFree((void*)pidl); SHFree((void*)pidl);
TRACE("szPath %s\n", debugstr_w(szPath)); 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; return E_FAIL;
} }
szPtr = wcsrchr(szPath, '.'); pszExt = wcsrchr(szPath, L'.');
if (szPtr) 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; return S_OK;
} }
HRESULT WINAPI HRESULT WINAPI
COpenWithMenu::Initialize(LPCITEMIDLIST pidlFolder, COpenWithMenu::Initialize(LPCITEMIDLIST pidlFolder,
IDataObject *pdtobj, HKEY hkeyProgID ) IDataObject *pdtobj,
HKEY hkeyProgID)
{ {
TRACE("This %p\n", this); TRACE("This %p\n", this);
@ -1103,10 +1103,9 @@ COpenWithMenu::Initialize(LPCITEMIDLIST pidlFolder,
return SHEOW_LoadOpenWithItems(pdtobj); return SHEOW_LoadOpenWithItems(pdtobj);
} }
HRESULT WINAPI SHOpenWithDialog( HRESULT WINAPI
HWND hwndParent, SHOpenWithDialog(HWND hwndParent,
const OPENASINFO *poainfo const OPENASINFO *poainfo)
)
{ {
MSG msg; MSG msg;
BOOL bRet; BOOL bRet;

View file

@ -1462,8 +1462,11 @@ STDAPI DllRegisterServer()
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
// extra registration stuff for the IShellFolder hr = SHELL_RegisterShellFolders();
return DoRegisterServer(); if (FAILED(hr))
return hr;
return S_OK;
} }
/*********************************************************************** /***********************************************************************
@ -1481,8 +1484,7 @@ STDAPI DllUnregisterServer()
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
// extra stuff which is performed for IShellFolder return S_OK;
return DoUnregisterServer();
} }
/************************************************************************* /*************************************************************************

View file

@ -365,9 +365,9 @@ HRESULT WINAPI CAdminToolsFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwF
if (!pszPath) if (!pszPath)
return E_OUTOFMEMORY; 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) && if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
(GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING)) (GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING))

View file

@ -480,13 +480,14 @@ HRESULT WINAPI CControlPanelFolder::GetAttributesOf(UINT cidl, LPCITEMIDLIST * a
return E_INVALIDARG; return E_INVALIDARG;
if (*rgfInOut == 0) if (*rgfInOut == 0)
*rgfInOut = ~0; *rgfInOut = ~0;
while(cidl > 0 && *apidl) { while(cidl > 0 && *apidl)
pdump(*apidl); {
SHELL32_GetItemAttributes(this, *apidl, rgfInOut); pdump(*apidl);
apidl++; SHELL32_GetItemAttributes(this, *apidl, rgfInOut);
cidl--; apidl++;
cidl--;
} }
/* make sure SFGAO_VALIDATE is cleared, some apps depend on that */ /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
*rgfInOut &= ~SFGAO_VALIDATE; *rgfInOut &= ~SFGAO_VALIDATE;
@ -567,14 +568,15 @@ HRESULT WINAPI CControlPanelFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD d
CHAR szName[MAX_PATH]; CHAR szName[MAX_PATH];
WCHAR wszName[MAX_PATH+1]; /* +1 for potential backslash */ WCHAR wszName[MAX_PATH+1]; /* +1 for potential backslash */
PIDLCPanelStruct *pCPanel; PIDLCPanelStruct *pCPanel;
HRESULT hr;
*szName = '\0'; *szName = '\0';
TRACE("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet); TRACE("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
pdump(pidl); pdump(pidl);
if (!pidl || !strRet) if (!pidl)
return E_INVALIDARG; return S_FALSE;
pCPanel = _ILGetCPanelPointer(pidl); pCPanel = _ILGetCPanelPointer(pidl);
@ -588,38 +590,38 @@ HRESULT WINAPI CControlPanelFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD d
else if (_ILIsSpecialFolder(pidl)) else if (_ILIsSpecialFolder(pidl))
{ {
BOOL bSimplePidl = _ILIsPidlSimple(pidl); BOOL bSimplePidl = _ILIsPidlSimple(pidl);
SFGAOF Attr = SFGAO_FILESYSTEM;
if (bSimplePidl)
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 */ _ILSimpleGetTextW(pidl, wszName, MAX_PATH); /* append my own path */
} }
else else
{ {
FIXME("special pidl\n"); FIXME("special pidl\n");
} if (dwFlags & SHGDN_FORPARSING)
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 (!WideCharToMultiByte(CP_ACP, 0, wszName, -1, szName, MAX_PATH, NULL, NULL)) /* go deeper if needed */
wszName[0] = '\0'; 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; strRet->uType = STRRET_CSTR;
@ -796,15 +798,10 @@ ExecuteAppletFromCLSID(LPOLESTR pOleStr)
dwSize = sizeof(szCmd); dwSize = sizeof(szCmd);
if (RegGetValueW(HKEY_CLASSES_ROOT, szBuffer, NULL, RRF_RT_REG_SZ, &dwType, (PVOID)szCmd, &dwSize) != ERROR_SUCCESS) 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; 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))) if (!ExpandEnvironmentStringsW(szCmd, szExpCmd, sizeof(szExpCmd)/sizeof(WCHAR)))
return E_FAIL; return E_FAIL;
@ -846,7 +843,6 @@ HRESULT WINAPI CControlPanelFolder::Execute(LPSHELLEXECUTEINFOW psei)
return E_INVALIDARG; return E_INVALIDARG;
if (StringFromCLSID(*iid, &pOleStr) == S_OK) if (StringFromCLSID(*iid, &pOleStr) == S_OK)
{ {
hr = ExecuteAppletFromCLSID(pOleStr); hr = ExecuteAppletFromCLSID(pOleStr);
CoTaskMemFree(pOleStr); CoTaskMemFree(pOleStr);
return hr; return hr;

View file

@ -436,7 +436,7 @@ HRESULT WINAPI CFontsFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDL
*/ */
HRESULT WINAPI CFontsFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) 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); TRACE("ISF_Fonts_fnGetDisplayNameOf (%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
pdump (pidl); pdump (pidl);
@ -444,17 +444,39 @@ HRESULT WINAPI CFontsFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags,
if (!strRet) if (!strRet)
return E_INVALIDARG; return E_INVALIDARG;
pfont = _ILGetFontStruct(pidl); pFont = _ILGetFontStruct(pidl);
if (!pfont) 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; 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; return S_OK;
} }

View file

@ -136,11 +136,12 @@ BOOL CDrivesFolderEnum::CreateMyCompEnumList(DWORD dwFlags)
RegGetValueW(hKey, wszBuf, NULL, RRF_RT_REG_SZ, NULL, wszBuf, &dwSize); RegGetValueW(hKey, wszBuf, NULL, RRF_RT_REG_SZ, NULL, wszBuf, &dwSize);
} }
/* FIXME: shell extensions, shouldn't the type be /* FIXME: shell extensions - the type should be PT_SHELLEXT (tested) */
* PT_SHELLEXT? */
pidl = _ILCreateGuidFromStrW(wszBuf); pidl = _ILCreateGuidFromStrW(wszBuf);
if (pidl != NULL) if (pidl != NULL)
bRet = AddToEnumList(pidl); bRet = AddToEnumList(pidl);
else
ERR("Invalid MyComputer namespace extesion: %s\n", wszBuf);
j++; j++;
} }
else if (ERROR_NO_MORE_ITEMS == ErrorCode) else if (ERROR_NO_MORE_ITEMS == ErrorCode)
@ -171,17 +172,19 @@ HRESULT WINAPI CDrivesFolder::FinalConstruct()
{ {
DWORD dwSize; DWORD dwSize;
WCHAR szName[MAX_PATH]; WCHAR szName[MAX_PATH];
WCHAR wszMyCompKey[256];
INT i;
pidlRoot = _ILCreateMyComputer(); /* my qualified pidl */ pidlRoot = _ILCreateMyComputer(); /* my qualified pidl */
if (pidlRoot == NULL) if (pidlRoot == NULL)
return E_OUTOFMEMORY; 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); dwSize = sizeof(szName);
if (RegGetValueW(HKEY_CURRENT_USER, if (RegGetValueW(HKEY_CURRENT_USER, wszMyCompKey,
L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\{20D04FE0-3AEA-1069-A2D8-08002B30309D}",
NULL, RRF_RT_REG_SZ, NULL, szName, &dwSize) == ERROR_SUCCESS) NULL, RRF_RT_REG_SZ, NULL, szName, &dwSize) == ERROR_SUCCESS)
{ {
szName[MAX_PATH - 1] = 0;
sName = (LPWSTR)SHAlloc((wcslen(szName) + 1) * sizeof(WCHAR)); sName = (LPWSTR)SHAlloc((wcslen(szName) + 1) * sizeof(WCHAR));
if (sName) if (sName)
{ {
@ -384,10 +387,12 @@ HRESULT WINAPI CDrivesFolder::GetAttributesOf (UINT cidl, LPCITEMIDLIST * apidl,
if (*rgfInOut == 0) if (*rgfInOut == 0)
*rgfInOut = ~0; *rgfInOut = ~0;
if(cidl == 0) { if(cidl == 0)
*rgfInOut &= dwComputerAttributes; *rgfInOut &= dwComputerAttributes;
} else { else
while (cidl > 0 && *apidl) { {
while (cidl > 0 && *apidl)
{
pdump (*apidl); pdump (*apidl);
SHELL32_GetItemAttributes (this, *apidl, rgfInOut); SHELL32_GetItemAttributes (this, *apidl, rgfInOut);
apidl++; apidl++;

View file

@ -561,7 +561,7 @@ HRESULT WINAPI CPrinterFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlag
return E_INVALIDARG; return E_INVALIDARG;
} }
if (_ILIsPrinter(pidl)) if (!pidl->mkid.cb)
{ {
pszName = (LPWSTR)CoTaskMemAlloc(MAX_PATH * sizeof(WCHAR)); pszName = (LPWSTR)CoTaskMemAlloc(MAX_PATH * sizeof(WCHAR));
if (!pszName) if (!pszName)

View 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); TRACE ("(%p)->(pidl=%p 0x%08x %p 0x%08x)\n", psf, pidl, dwFlags, szOut, dwOutLen);
pdump (pidl); pdump (pidl);
pidlFirst = ILCloneFirst (pidl); pidlFirst = ILCloneFirst(pidl);
if (pidlFirst) { if (pidlFirst)
IShellFolder2 *psfChild; {
IShellFolder *psfChild;
hr = psf->BindToObject(pidlFirst, NULL, IID_IShellFolder, (LPVOID *) & psfChild); hr = psf->BindToObject(pidlFirst, NULL, IID_IShellFolder, (LPVOID *) & psfChild);
if (SUCCEEDED (hr)) { if (SUCCEEDED (hr))
STRRET strTemp; {
LPITEMIDLIST pidlNext = ILGetNext (pidl); STRRET strTemp;
LPITEMIDLIST pidlNext = ILGetNext (pidl);
hr = psfChild->GetDisplayNameOf(pidlNext, dwFlags, &strTemp); hr = psfChild->GetDisplayNameOf(pidlNext, dwFlags, &strTemp);
if (SUCCEEDED (hr)) { if (SUCCEEDED (hr))
if(!StrRetToStrNW (szOut, dwOutLen, &strTemp, pidlNext)) {
if(!StrRetToStrNW (szOut, dwOutLen, &strTemp, pidlNext))
hr = E_FAIL; hr = E_FAIL;
}
psfChild->Release();
} }
psfChild->Release(); ILFree (pidlFirst);
}
ILFree (pidlFirst);
} else } else
hr = E_OUTOFMEMORY; hr = E_OUTOFMEMORY;
TRACE ("-- ret=0x%08x %s\n", hr, debugstr_w(szOut)); TRACE ("-- ret=0x%08x %s\n", hr, debugstr_w(szOut));
@ -394,13 +397,20 @@ HRESULT SHELL32_GetItemAttributes (IShellFolder * psf, LPCITEMIDLIST pidl, LPDWO
dwAttributes = *pdwAttributes; dwAttributes = *pdwAttributes;
if (_ILIsDrive (pidl)) { /* Attributes of some special folders are hardcoded */
if (_ILIsDrive(pidl)) {
*pdwAttributes &= SFGAO_HASSUBFOLDER|SFGAO_FILESYSTEM|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR| *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)) { } else if (has_guid && HCR_GetFolderAttributes(pidl, &dwAttributes)) {
*pdwAttributes = dwAttributes; *pdwAttributes = dwAttributes;
} else if (_ILGetDataPointer (pidl)) { } else if (_ILGetDataPointer(pidl)) {
dwAttributes = _ILGetFileAttributes (pidl, NULL, 0); dwAttributes = _ILGetFileAttributes(pidl, NULL, 0);
if (!dwAttributes && has_guid) { if (!dwAttributes && has_guid) {
WCHAR path[MAX_PATH]; WCHAR path[MAX_PATH];
@ -419,9 +429,9 @@ HRESULT SHELL32_GetItemAttributes (IShellFolder * psf, LPCITEMIDLIST pidl, LPDWO
} }
} }
/* Set common attributes */ /* Set common attributes */
*pdwAttributes |= SFGAO_FILESYSTEM | SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANDELETE | *pdwAttributes |= SFGAO_FILESYSTEM | SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANDELETE |
SFGAO_CANRENAME | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANCOPY; SFGAO_CANRENAME | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANCOPY;
if (dwAttributes & FILE_ATTRIBUTE_DIRECTORY) if (dwAttributes & FILE_ATTRIBUTE_DIRECTORY)
{ {

View file

@ -1131,13 +1131,18 @@ HRESULT CDefView::OpenSelectedItems()
ici.lpVerb = MAKEINTRESOURCEA( def ); ici.lpVerb = MAKEINTRESOURCEA( def );
ici.hwnd = m_hWnd; 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); hr = IUnknown_SetSite(cm, NULL);
return S_OK; return S_OK;
} }
else
ERR("InvokeCommand failed: %x\n", hr);
} }
else
ERR("No default context menu item\n");
} }
DestroyMenu( hmenu ); DestroyMenu( hmenu );
@ -1160,7 +1165,7 @@ HRESULT CDefView::OpenSelectedItems()
{ {
CF_IDLIST = RegisterClipboardFormatW(CFSTR_SHELLIDLIST); CF_IDLIST = RegisterClipboardFormatW(CFSTR_SHELLIDLIST);
} }
fetc.cfFormat = CF_IDLIST; fetc.cfFormat = CF_IDLIST;
fetc.ptd = NULL; fetc.ptd = NULL;
fetc.dwAspect = DVASPECT_CONTENT; fetc.dwAspect = DVASPECT_CONTENT;

View file

@ -309,6 +309,7 @@ HasClipboardData()
return ret; return ret;
} }
static
VOID VOID
DisablePasteOptions(HMENU hMenu) DisablePasteOptions(HMENU hMenu)
{ {
@ -338,28 +339,25 @@ IDefaultContextMenuImpl::IsShellExtensionAlreadyLoaded(const CLSID * szClass)
HRESULT HRESULT
IDefaultContextMenuImpl::SH_LoadDynamicContextMenuHandler(HKEY hKey, const CLSID * szClass, BOOL bExternalInit) IDefaultContextMenuImpl::SH_LoadDynamicContextMenuHandler(HKEY hKey, const CLSID * pClass, BOOL bExternalInit)
{ {
HRESULT hr; HRESULT hr;
IContextMenu * cmobj; IContextMenu * cmobj;
IShellExtInit *shext; IShellExtInit *shext;
PDynamicShellEntry curEntry; PDynamicShellEntry curEntry;
//WCHAR szTemp[100];
LPOLESTR pstr; 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); TRACE("SH_LoadDynamicContextMenuHandler entered with This %p hKey %p pClass %s bExternalInit %u\n", this, hKey, wine_dbgstr_guid(pClass), 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)) if (IsShellExtensionAlreadyLoaded(pClass))
return S_OK; 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) if (hr != S_OK)
{ {
TRACE("SHCoCreateInstance failed %x\n", GetLastError()); ERR("SHCoCreateInstance failed %x\n", GetLastError());
return hr; return hr;
} }
@ -368,7 +366,7 @@ IDefaultContextMenuImpl::SH_LoadDynamicContextMenuHandler(HKEY hKey, const CLSID
hr = cmobj->QueryInterface(IID_IShellExtInit, (void**)&shext); hr = cmobj->QueryInterface(IID_IShellExtInit, (void**)&shext);
if (hr != S_OK) 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(); cmobj->Release();
return FALSE; return FALSE;
} }
@ -376,7 +374,7 @@ IDefaultContextMenuImpl::SH_LoadDynamicContextMenuHandler(HKEY hKey, const CLSID
shext->Release(); shext->Release();
if (hr != S_OK) 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(); cmobj->Release();
return hr; return hr;
} }
@ -393,7 +391,7 @@ IDefaultContextMenuImpl::SH_LoadDynamicContextMenuHandler(HKEY hKey, const CLSID
curEntry->Next = NULL; curEntry->Next = NULL;
curEntry->NumIds = 0; curEntry->NumIds = 0;
curEntry->CMenu = cmobj; curEntry->CMenu = cmobj;
memcpy(&curEntry->ClassID, szClass, sizeof(CLSID)); memcpy(&curEntry->ClassID, pClass, sizeof(CLSID));
if (dhead) if (dhead)
{ {
@ -660,7 +658,7 @@ IDefaultContextMenuImpl::AddStaticContextMenusToMenu(
} }
else 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 else
@ -728,7 +726,7 @@ void WINAPI _InsertMenuItemW (
} }
else else
{ {
TRACE("failed to load string %p\n", dwTypeData); ERR("failed to load string %p\n", dwTypeData);
return; return;
} }
} }
@ -766,9 +764,11 @@ IDefaultContextMenuImpl::BuildShellItemContextMenu(
TRACE("BuildShellItemContextMenu entered\n"); 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'.'); pOffset = wcsrchr(szPath, L'.');
if (pOffset) if (pOffset)
@ -803,6 +803,8 @@ IDefaultContextMenuImpl::BuildShellItemContextMenu(
} }
} }
} }
else
ERR("GetDisplayNameOf failed: %x\n", hr);
guid = _ILGetGUIDPointer(dcm.apidl[0]); guid = _ILGetGUIDPointer(dcm.apidl[0]);
if (guid) if (guid)
@ -841,10 +843,13 @@ IDefaultContextMenuImpl::BuildShellItemContextMenu(
/* add static actions */ /* add static actions */
rfg = SFGAO_BROWSABLE | SFGAO_CANCOPY | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANDELETE | SFGAO_CANRENAME | SFGAO_HASPROPSHEET | SFGAO_FILESYSTEM | SFGAO_FOLDER; 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); hr = dcm.psf->GetAttributesOf(dcm.cidl, dcm.apidl, &rfg);
if (!SUCCEEDED(hr)) if (FAILED(hr))
{
WARN("GetAttributesOf failed: %x\n", hr);
rfg = 0; rfg = 0;
}
if (rfg & SFGAO_FOLDER) if ((rfg & SFGAO_FOLDER) || _ILIsControlPanel(dcm.apidl[dcm.cidl]))
{ {
/* add the default verbs open / explore */ /* add the default verbs open / explore */
SH_AddStaticEntryForFileClass(L"Folder"); SH_AddStaticEntryForFileClass(L"Folder");
@ -1156,8 +1161,7 @@ HRESULT
IDefaultContextMenuImpl::DoOpenOrExplore( IDefaultContextMenuImpl::DoOpenOrExplore(
LPCMINVOKECOMMANDINFO lpcmi) LPCMINVOKECOMMANDINFO lpcmi)
{ {
UNIMPLEMENTED;
return E_FAIL; return E_FAIL;
} }
@ -1450,7 +1454,7 @@ IDefaultContextMenuImpl::DoProperties(
{ {
//FIXME path! //FIXME path!
ShellExecuteW(NULL, L"open", L"explorer.exe", 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); NULL, SW_SHOWDEFAULT);
return S_OK; return S_OK;
} }
@ -1697,7 +1701,7 @@ SHCreateDefaultContextMenu(
*ppv = NULL; *ppv = NULL;
hr = IDefaultContextMenu_Constructor( pdcm, riid, ppv ); hr = IDefaultContextMenu_Constructor( pdcm, riid, ppv );
if (FAILED(hr)) WARN("IDefaultContextMenu_Constructor failed: %x\n", hr);
TRACE("pcm %p hr %x\n", pdcm, hr); TRACE("pcm %p hr %x\n", pdcm, hr);
return hr; return hr;
} }