2009-12-05 4 views
1

Je suis en train de mettre en œuvre une extension shell qui étend IContextMenu3 et IShellExtInit, et je suis d'insérer des éléments de menu à l'aide de la méthode décrite dans la section HBMMENU_CALLBACK method mais dans mon projet la méthode HandleMenuMsg2 ou HandleMenuMsg est jamais appelé .IContextMenu3 HandleMenuMsg2 est jamais appelé

Quelqu'un peut-il m'expliquer s'il vous plaît ce qui est nécessaire pour recevoir les appels HandleMenuMsg2?

Mon objet ATL est mis en œuvre comme:

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

Et j'insérer des éléments de menu comme décrit dans la page 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) 
{ 
... 
} 

Avec tout cela, les entrées de menu apear dans le contexte de l'explorateur menu, mais aucune image n'est affichée, les deux méthodes HandleMenuMsg et HandleMenuMsg2 ne sont jamais appelées, et le système que je teste est WinXP (dans Vista tout est ok parce que nous utilisons le hbmpItem).

Il me manque une certaine inicialisation ou quoi? quelqu'un peut-il m'expliquer?

Merci

Répondre

0

J'arrive d'avoir travaillé sur cette question aujourd'hui et couru à travers votre question. Comme j'utilise WinAPI pur, je ne suis pas sûr de la sémantique MFC, mais ma meilleure estimation est que votre QueryInterface() ne gère probablement pas une demande pour l'interface IContextMenu3.

(.. Même si vous avez probablement résolu ce problème il y a longtemps encore, d'autres pourraient trouver une utilisation à connaître)

0

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

Le fmask spécifie le type d'élément que vous insérez. Sur cette ligne, vous dites que l'élément est un sous-menu de chaîne bitmap.

De plus, vous spécifiez MIIM_DATA mais ne définissez pas dwMenuData.

Questions connexes