1

IContextMenu3およびを拡張するシェル拡張を実装しようとしています。セクションHBMMENU_CALLBACK メソッドIShellExtInitで説明されている方法を使用してメニュー項目を挿入していますが、私のプロジェクトではメソッドまたはが呼び出されません。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)
{
...
}

これらすべてで、エクスプローラーのコンテキストメニューにメニューエントリが表示されますが、画像は表示されず、メソッドHandleMenuMsgとメソッドの両方HandleMenuMsg2が呼び出されることはなく、テストしているシステムは WinXP です (Vista では を使用しているため、すべて問題ありませんhbmpItem)。

初期化が不足していますか?誰か私を説明できますか?

ありがとう

4

2 に答える 2

0

menuiteminfo.fMask = MIIM_FTYPE | MIIM_ID | MIIM_サブメニュー | MIIM_DATA | MIIM_BITMAP | MIIM_STRING;

fmask は、挿入する項目のタイプを指定します。その行では、項目がビットマップ文字列サブメニューであると述べています。

また、MIIM_DATA を指定しますが、設定しないでくださいdwMenuData

于 2012-05-02T22:09:12.913 に答える
0

今日たまたまこれに取り組んでいて、あなたの質問に出くわしました。私は純粋な WinAPI を使用しているため、MFC のセマンティクスについてはよくわかりませんが、おそらくIContextMenu3インターフェイスQueryInterface()の要求を処理していないのではないかと推測されます。

(あなたはおそらくずっと前にこの問題を解決しているでしょう。それでも、他の人は知ることの用途を見つけるかもしれません.)

于 2010-12-22T19:49:05.697 に答える