mirror of
https://github.com/reactos/reactos.git
synced 2024-09-28 13:34:53 +00:00
[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:
parent
ea28cf9d0d
commit
8f70e43420
|
@ -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);
|
||||||
|
|
|
@ -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}'
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue