mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 17:34:57 +00:00
[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:
parent
4e9b968c96
commit
7a0ad93bff
15 changed files with 205 additions and 155 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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 ''
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@ HKCR
|
|||
}
|
||||
'ShellFolder'
|
||||
{
|
||||
val Attributes = d '&H60000100'
|
||||
val Attributes = d '&H60000000'
|
||||
val WantsFORPARSING = s ''
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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++;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue