[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)
{
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;
}

View file

@ -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)

View file

@ -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

View file

@ -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 ''
}

View file

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

View file

@ -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;

View file

@ -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;
}
/*************************************************************************

View file

@ -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))

View file

@ -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;

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)
{
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;
}

View file

@ -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++;

View file

@ -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)

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);
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)
{

View file

@ -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;

View file

@ -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;
}