У меня есть расширение DLL оболочки c ++. Метод Initialize вызывается дважды, если я щелкаю в окне обозревателя левой панели просмотра дерева папок. Но если я щелкну любую папку на правой панели окна проводника, метод Initialize вызывается один раз.
Проблема в том, что мои недавно добавленные пункты меню отображаются дважды в контекстном меню, если я нажимаю на представление дерева левой панели.
Мне интересно, это функциональность окна?
Я прокомментировал всю мою реализацию и протестировал с помощью приведенного ниже кода:
IFACEMETHODIMP CMyContextMenu::QueryContextMenu(HMENU hmenu, UINT /*uIndex*/, UINT cmdFirst, UINT /*uidCmdLast*/, UINT /*uFlags*/ )
{
UINT cmdId = uidCmdFirst;
OutputDebugString(L"QueryContextMenu");
return MAKE_HRESULT ( SEVERITY_SUCCESS, FACILITY_NULL, cmdId - mdFirst );
}
IFACEMETHODIMP CMyContextMenu::Initialize(LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDO, HKEY /*hkeyProgID*/)
{
OutputDebugString(L"Initialize");
return S_OK;
}
Когда я нажимаю на левую панель, вывод DebugViewr:
Initialize
QueryContextMenu
Initialize
QueryContextMenu
NoRemove Directory
{
NoRemove Background
{
NoRemove ShellEx
{
NoRemove ContextMenuHandlers
{
ForceRemove myContext = s '{AE843198-3C5D-4EA6-B74F-7A41FC91D7FF}'
}
}
}
}
NoRemove Directory
{
NoRemove ShellEx
{
NoRemove ContextMenuHandlers
{
ForceRemove myContext = s '{AE843198-3C5D-4EA6-B74F-7A41FC91D7FF}'
}
}
}
Приведенная выше запись реестра вызывает эту проблему в Win 7. Если я удалю «NoRemove Background», контекстное меню будет отображаться один раз в виде дерева. Но если я нажму на пустую область папки, метод Initialize вызываться не будет.