Вызывается IContextMenu::QueryContextMenu, но IContextMenu::InvokeCommand не выполняет

#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. Я пропустил это место.. Настоящим я признаю ваши экстрасенсорные способности 😉