Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > Проблема с IContextMenu


Автор: rainbow86 26.11.2006, 16:19
Пытаюсь добавить свой пункт в контекстное меню explorer'a.
Вот заголовочный файл
Код

#pragma once
#include "resource.h"       // main symbols
#include "SimpleExtension.h"

#include <shlobj.h>
#include <comdef.h>

// CSimpleShlExt

class ATL_NO_VTABLE CSimpleShlExt :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CSimpleShlExt, &CLSID_SimpleShlExt>,
    public IDispatchImpl<ISimpleShlExt, &IID_ISimpleShlExt, &LIBID_SimpleExtensionLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
    public IShellExtInit,
    public IContextMenu
{
public:
    CSimpleShlExt()
    {
    }

DECLARE_REGISTRY_RESOURCEID(IDR_SIMPLESHLEXT)


BEGIN_COM_MAP(CSimpleShlExt)
    COM_INTERFACE_ENTRY(ISimpleShlExt)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(IShellExtInit)
    COM_INTERFACE_ENTRY(IContextMenu)
END_COM_MAP()



    DECLARE_PROTECT_FINAL_CONSTRUCT()

    HRESULT FinalConstruct()
    {
        return S_OK;
    }

    void FinalRelease()
    {
    }
protected:
    TCHAR m_szFile [MAX_PATH];
public:
    STDMETHOD(Initialize)(LPCITEMIDLIST, LPDATAOBJECT, HKEY);
    STDMETHOD(GetCommandString)(UINT, UINT, UINT*, LPSTR, UINT);
    STDMETHOD(InvokeCommand)(LPCMINVOKECOMMANDINFO);
    STDMETHOD(QueryContextMenu)(HMENU, UINT, UINT, UINT, UINT);
};

OBJECT_ENTRY_AUTO(__uuidof(SimpleShlExt), CSimpleShlExt)



При компиляции выдает ошибки на строку:

COM_INTERFACE_ENTRY(IContextMenu)

error C2787:'IContextMenu' : no GUID has been associated with this object

error C2440: 'initializing' : cannot convert from 'DWORD_PTR' to 'const IID *'
                     Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or
                     function-style cast             

error C2440: 'initializing' : cannot convert from 'ATL::_ATL_CREATORARGFUNC (__stdcall *)' to 'DWORD_PTR'


Мож кто-нибудь знает в чем проблема?   smile 

Заранее благодарен!

Автор: Andrey44 19.11.2008, 11:29
Пытаюсь скомпилить тот-же пример скачаный с кодепрожекта.
Та-же ошибка. Что делать? smile 

Автор: xvr 19.11.2008, 13:04
Замените COM_INTERFACE_ENTRY(IContextMenu) на COM_INTERFACE_ENTRY_IID(IID_IContextMenu,IContextMenu)

Автор: Andrey44 21.11.2008, 08:04
xvr, да, спасибо, сработало.
Почему макрос COM_INTERFACE_ENTRY не сработал?

Автор: xvr 21.11.2008, 10:25
Цитата(Andrey44 @ 21.11.2008,  08:04)
xvr, да, спасибо, сработало.
Почему макрос COM_INTERFACE_ENTRY не сработал?

Макрос COM_INTERFACE_ENTRY получает GUID интерфейса через оператор __uuidof() (расширение MS). Что бы этот оператор сработал это GUID надо явно указать для интерфейса через __declspec(uuid()). Это указание закопано глубоко в недрах define'ов, один из которых генерит midl для интерфейсов (из idl файла). #import работает аналогично. Интерфейс же IContextMenu определен не через idl, а отписан руками в хидере shlobj.h, и там этого __declspec нету (иногда у MS бывают на редкость кривые руки  smile )
COM_INTERFACE_ENTRY_IID получает GUID явно первым параметром

Автор: Andrey44 21.11.2008, 11:08
xvr, спасибо за разъяснение. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)