gpt4 book ai didi

c++ - IContextMenu3 HandleMenuMsg2 从未被调用

转载 作者:太空宇宙 更新时间:2023-11-04 14:28:11 24 4
gpt4 key购买 nike

我正在尝试实现一个扩展 IContextMenu3IShellExtInit 的 shell 扩展,并且我正在使用 HBMMENU_CALLBACK method 节中描述的方法插入菜单项。但在我的项目中,从未调用方法 HandleMenuMsg2HandleMenuMsg

任何人都可以向我解释接收 HandleMenuMsg2 调用需要什么吗?

我的 ATL 对象是这样实现的:

    // 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);

我正在插入菜单项,如 nanoANT 页面中所述:

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)
{
...
}

有了这一切,菜单条目出现在资源管理器上下文菜单中,但没有显示图像,HandleMenuMsgHandleMenuMsg2 方法都不会被调用,而且我正在使用的系统测试是 WinXP(在 vista 中一切正常,因为我们使用了 hbmpItem)。

我缺少一些初始化还是什么?谁能给我解释一下?

谢谢

最佳答案

我今天碰巧一直在研究这个,遇到了你的问题。由于我使用纯 WinAPI,我不确定 MFC 语义,但我最好的猜测是您的 QueryInterface() 可能不处理对 IContextMenu3 接口(interface)的请求。

(虽然您可能很久以前就解决了这个问题。不过,其他人可能会发现了解它是有用的。)

关于c++ - IContextMenu3 HandleMenuMsg2 从未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1853224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com