Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с IContextMenu 
:(
    Опции темы
rainbow86
Дата 26.11.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 27.10.2005

Репутация: нет
Всего: нет



Пытаюсь добавить свой пункт в контекстное меню 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 

Заранее благодарен!
PM MAIL   Вверх
Andrey44
Дата 19.11.2008, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Пытаюсь скомпилить тот-же пример скачаный с кодепрожекта.
Та-же ошибка. Что делать? smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
xvr
Дата 19.11.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Замените COM_INTERFACE_ENTRY(IContextMenu) на COM_INTERFACE_ENTRY_IID(IID_IContextMenu,IContextMenu)

PM MAIL   Вверх
Andrey44
Дата 21.11.2008, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



xvr, да, спасибо, сработало.
Почему макрос COM_INTERFACE_ENTRY не сработал?


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
xvr
Дата 21.11.2008, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(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 явно первым параметром

PM MAIL   Вверх
Andrey44
Дата 21.11.2008, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



xvr, спасибо за разъяснение. smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.