#c #windows #com #atl #com-server
#c #Windows #com #atl #com-сервер
Вопрос:
В моей реализации IContextMenu
COM-сервера QueryContextMenu
вызывается (можно увидеть это с помощью ведения журнала), но InvokeCommand
этого не происходит. Вот QueryContextMenu
:
HRESULT ContexMenuImp::QueryContextMenu(HMENU hmenu,UINT indexMenu,UINT idCmdFirst,
UINT idCmdLast,UINT uFlags)
{
if (uFlags amp; CMF_DEFAULTONLY) {
// shouldn't handle this situation:
LOG("IContextMenu::QueryContextMenu: (...,CMF_DEFAULTONLY)");
return MAKE_HRESULT(SEVERITY_SUCCESS,FACILITY_NULL,0);
}else if (InsertMenuItem(hmenu,indexMenu,TRUE,amp;globals.menuItemInfo) == FALSE){
// error occurred:
LOG("IContextMenu::QueryContextMenu: Error: %d",GetLastError());
return MAKE_HRESULT(SEVERITY_SUCCESS,FACILITY_NULL,0);
} else{
// the desired situation: add item to the menu:
LOG("IContextMenu::QueryContextMenu(hMenu,indexMenu:%u,idCmdFirst:%u,idCmdLast:%u,0x%x): All set...",
indexMenu,idCmdFirst,idCmdLast,uFlags);
return MAKE_HRESULT(SEVERITY_SUCCESS,FACILITY_NULL,1/*handle only a single item*/);
}
}
Есть идеи, почему?
Комментарии:
1. Понятия не имею. Как выглядит ваш код?
2. Мои экстрасенсорные способности говорят мне, что вы вернули S_OK вместо требуемого MAKE_HRESULT, или вы добавили свои пункты меню с неправильным идентификатором.
3. @RaymondChen: здесь плохая интуиция 🙂 был бы рад дополнительным попыткам.
Ответ №1:
Вы забыли idCmdFirst
указать, когда вставляли меню.
globals.menuItemInfo.wID = idCmdFirst;
globals.menuItemInfo.fMask |= MIIM_ID;
(Итак, я был прав: вы добавили свои пункты меню с неправильным идентификатором.)
Обратите внимание, что, поскольку каждое контекстное меню может иметь другой идентификатор, вам не следует использовать глобальный.
Комментарии:
1. Я пропустил это место.. Настоящим я признаю ваши экстрасенсорные способности 😉