[SHELL32]

- Don't load shell extensions from * key for background context menu. Fixes #6668 (background context menu not working after installing Notepad++)
- Properly set pidlFolder argument in extensions Initialize function call
- Fix openwithmenu.rgs file creating two keys instead of one

svn path=/trunk/; revision=54977
This commit is contained in:
Rafal Harabien 2012-01-15 16:45:36 +00:00
parent ea28cf9d0d
commit 8f70e43420
2 changed files with 33 additions and 16 deletions

View file

@ -42,6 +42,7 @@ class CDefaultContextMenu :
private: private:
DEFCONTEXTMENU m_Dcm; DEFCONTEXTMENU m_Dcm;
IDataObject *m_pDataObj; IDataObject *m_pDataObj;
LPCITEMIDLIST m_pidlFolder;
DWORD m_bGroupPolicyActive; DWORD m_bGroupPolicyActive;
PDynamicShellEntry m_pDynamicEntries; /* first dynamic shell extension entry */ PDynamicShellEntry m_pDynamicEntries; /* first dynamic shell extension entry */
UINT m_iIdSHEFirst; /* first used id */ UINT m_iIdSHEFirst; /* first used id */
@ -92,8 +93,9 @@ class CDefaultContextMenu :
CDefaultContextMenu::CDefaultContextMenu() CDefaultContextMenu::CDefaultContextMenu()
{ {
memset (&m_Dcm, 0, sizeof(m_Dcm)); memset(&m_Dcm, 0, sizeof(m_Dcm));
m_pDataObj = NULL; m_pDataObj = NULL;
m_pidlFolder = NULL;
m_bGroupPolicyActive = 0; m_bGroupPolicyActive = 0;
m_pDynamicEntries = NULL; m_pDynamicEntries = NULL;
m_iIdSHEFirst = 0; m_iIdSHEFirst = 0;
@ -108,7 +110,7 @@ CDefaultContextMenu::~CDefaultContextMenu()
PDynamicShellEntry dEntry, dNext; PDynamicShellEntry dEntry, dNext;
PStaticShellEntry sEntry, sNext; PStaticShellEntry sEntry, sNext;
/* free dynamic shell extension entries */ /* Free dynamic shell extension entries */
dEntry = m_pDynamicEntries; dEntry = m_pDynamicEntries;
while (dEntry) while (dEntry)
{ {
@ -117,7 +119,8 @@ CDefaultContextMenu::~CDefaultContextMenu()
HeapFree(GetProcessHeap(), 0, dEntry); HeapFree(GetProcessHeap(), 0, dEntry);
dEntry = dNext; dEntry = dNext;
} }
/* free static shell extension entries */
/* Free static shell extension entries */
sEntry = m_pStaticEntries; sEntry = m_pStaticEntries;
while (sEntry) while (sEntry)
{ {
@ -127,6 +130,11 @@ CDefaultContextMenu::~CDefaultContextMenu()
HeapFree(GetProcessHeap(), 0, sEntry); HeapFree(GetProcessHeap(), 0, sEntry);
sEntry = sNext; sEntry = sNext;
} }
if (m_pidlFolder)
ILFree((_ITEMIDLIST*)m_pidlFolder);
if (m_pDataObj)
m_pDataObj->Release();
} }
HRESULT WINAPI CDefaultContextMenu::Initialize(const DEFCONTEXTMENU *pdcm) HRESULT WINAPI CDefaultContextMenu::Initialize(const DEFCONTEXTMENU *pdcm)
@ -136,6 +144,25 @@ HRESULT WINAPI CDefaultContextMenu::Initialize(const DEFCONTEXTMENU *pdcm)
TRACE("cidl %u\n", pdcm->cidl); TRACE("cidl %u\n", pdcm->cidl);
if (SUCCEEDED(SHCreateDataObject(pdcm->pidlFolder, pdcm->cidl, pdcm->apidl, NULL, IID_IDataObject, (void**)&pDataObj))) if (SUCCEEDED(SHCreateDataObject(pdcm->pidlFolder, pdcm->cidl, pdcm->apidl, NULL, IID_IDataObject, (void**)&pDataObj)))
m_pDataObj = pDataObj; m_pDataObj = pDataObj;
if (!pdcm->cidl)
{
/* Init pidlFolder only if is background context menu. See IShellExtInit::Initialize */
if (pdcm->pidlFolder)
m_pidlFolder = ILClone(pdcm->pidlFolder);
else
{
IPersistFolder2 *pf = NULL;
if (SUCCEEDED(pdcm->psf->QueryInterface(IID_IPersistFolder2, (PVOID*)&pf)))
{
if (FAILED(pf->GetCurFolder((_ITEMIDLIST**)&m_pidlFolder)))
ERR("GetCurFolder failed\n");
pf->Release();
}
}
TRACE("pidlFolder %p\n", m_pidlFolder);
}
CopyMemory(&m_Dcm, pdcm, sizeof(DEFCONTEXTMENU)); CopyMemory(&m_Dcm, pdcm, sizeof(DEFCONTEXTMENU));
return S_OK; return S_OK;
} }
@ -362,7 +389,7 @@ CDefaultContextMenu::LoadDynamicContextMenuHandler(HKEY hKey, const CLSID *pClas
return hr; return hr;
} }
hr = shext->Initialize(NULL, m_pDataObj, hKey); hr = shext->Initialize(m_pidlFolder, m_pDataObj, hKey);
shext->Release(); shext->Release();
if (hr != S_OK) if (hr != S_OK)
{ {
@ -553,18 +580,8 @@ CDefaultContextMenu::BuildBackgroundContextMenu(
TRACE("disabling paste options\n"); TRACE("disabling paste options\n");
DisablePasteOptions(hMenu); DisablePasteOptions(hMenu);
} }
/* load extensions from HKCR\* key */
if (RegOpenKeyExW(HKEY_CLASSES_ROOT,
L"*",
0,
KEY_READ,
&hKey) == ERROR_SUCCESS)
{
EnumerateDynamicContextHandlerForKey(hKey);
RegCloseKey(hKey);
}
/* load create new shell extension */ /* Load context menu handlers */
if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"Directory\\Background", 0, KEY_READ, &hKey) == ERROR_SUCCESS) if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"Directory\\Background", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
{ {
EnumerateDynamicContextHandlerForKey(hKey); EnumerateDynamicContextHandlerForKey(hKey);

View file

@ -29,7 +29,7 @@ HKCR
{ {
NoRemove ContextMenuHandlers NoRemove ContextMenuHandlers
{ {
ForceRemove Open With = s '{09799AFB-AD67-11d1-ABCD-00C04FC30936}' ForceRemove 'Open With' = s '{09799AFB-AD67-11d1-ABCD-00C04FC30936}'
{ {
} }
} }