永远不会调用IContextMenu3 HandleMenuMsg2

时间:2009-12-05 19:43:19

标签: c++ winapi atl explorer windows-shell

我正在尝试实现扩展IContextMenu3IShellExtInit的shell扩展,我正在使用第HBMMENU_CALLBACK method节中描述的方法插入菜单项,但在我的项目中使用方法<{1}}或永远不会调用HandleMenuMsg2

有人可以解释一下接收HandleMenuMsg电话需要什么吗?

我的ATL对象实现如下:

HandleMenuMsg2

我正在插入nanoANT页面中描述的菜单项:

    // CTestPlugin
class ATL_NO_VTABLE CTestPlugin :
    public CComObjectRootEx<CComMultiThreadModel>,
    public CComCoClass<CTestPlugin, &CLSID_CTestPlugin>,
    public IShellExtInit,
    public IContextMenu3
{
public:
    CTestPlugin();
    ~CTestPlugin();

    HRESULT FinalConstruct();
    void FinalRelease();
public:
DECLARE_REGISTRY_RESOURCEID(IDR_TESTPLUGIN)
DECLARE_NOT_AGGREGATABLE(CTestPlugin)
BEGIN_COM_MAP(CTestPlugin)
    COM_INTERFACE_ENTRY(IShellExtInit)
    COM_INTERFACE_ENTRY(IContextMenu)
    COM_INTERFACE_ENTRY(IContextMenu2)
    COM_INTERFACE_ENTRY(IContextMenu3)
END_COM_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()
...
// IShellExtInit
    STDMETHODIMP Initialize(LPCITEMIDLIST, LPDATAOBJECT, HKEY);

    // IContextMenu
    STDMETHODIMP GetCommandString(UINT, UINT, UINT*, LPSTR, UINT)
    { return S_OK; }
    STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO);
    STDMETHODIMP QueryContextMenu(HMENU, UINT, UINT, UINT, UINT);
    // IContextMenu2
    STDMETHODIMP HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam);
    // IContextMenu3
    STDMETHODIMP HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult);

所有这些菜单条目在资源管理器上下文菜单中显示但没有显示图像,从不调用方法bool CTestPlugin::AddNewMenuItem(HMENU hmenu, UINT un_menu_text_id, UINT un_menu_index, UINT icon, UINT& uCmdID) { TCHAR chText[MAX_PATH]; ::LoadString( _AtlModule.m_hResInstance, un_menu_text_id, chText, MAX_PATH); MENUITEMINFO menuiteminfo; ZeroMemory(&menuiteminfo, sizeof(menuiteminfo)); menuiteminfo.cbSize = sizeof(menuiteminfo); menuiteminfo.fMask = MIIM_FTYPE | MIIM_ID | MIIM_SUBMENU | MIIM_DATA | MIIM_BITMAP | MIIM_STRING; menuiteminfo.fType = MFT_STRING; menuiteminfo.dwTypeData = chText; menuiteminfo.cch = _tcslen(chText); if (icon) { menuiteminfo.hbmpItem = SysInfo::Instance().IsVistaOrLater() ? _AtlModule.m_iconBitmapUtils.IconToBitmapPARGB32(_AtlModule.m_hResInstance, icon) : HBMMENU_CALLBACK; } menuiteminfo.wID = (UINT)uCmdID++; m_mapIdToIcon[menuiteminfo.wID] = icon; return (TRUE==InsertMenuItem(hmenu, un_menu_index, TRUE, &menuiteminfo)); } STDMETHODIMP CTestPlugin::HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam) { LRESULT res; return HandleMenuMsg2(uMsg, wParam, lParam, &res); } STDMETHODIMP CTestPlugin::HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult) { ... } HandleMenuMsg,我正在测试的系统是WinXP(在vista中)一切都好,因为我们使用HandleMenuMsg2)。

我错过了一些inicialization或者什么?任何人都可以解释一下吗?

由于

2 个答案:

答案 0 :(得分:0)

我今天碰巧在这方面工作,遇到了你的问题。由于我使用纯WinAPI,我不确定MFC语义,但我最好的猜测是你的QueryInterface()可能无法处理 IContextMenu3 接口的请求。

(虽然很久以前你可能已经解决了这个问题。但是,其他人可能会发现有用的知识。)

答案 1 :(得分:0)

  

menuiteminfo.fMask = MIIM_FTYPE | MIIM_ID | MIIM_SUBMENU | MIIM_DATA | MIIM_BITMAP | MIIM_STRING;

fmask指定要插入的项目类型。在该行上,您说该项是位图字符串子菜单。

另外,您指定MIIM_DATA但不设置dwMenuData