| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > Проблема с IContextMenu |
| Автор: rainbow86 26.11.2006, 16:19 | ||
| Пытаюсь добавить свой пункт в контекстное меню explorer'a. Вот заголовочный файл
При компиляции выдает ошибки на строку: 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' Мож кто-нибудь знает в чем проблема? Заранее благодарен! |
| Автор: Andrey44 19.11.2008, 11:29 |
| Пытаюсь скомпилить тот-же пример скачаный с кодепрожекта. Та-же ошибка. Что делать? |
| Автор: 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 | ||
Макрос COM_INTERFACE_ENTRY получает GUID интерфейса через оператор __uuidof() (расширение MS). Что бы этот оператор сработал это GUID надо явно указать для интерфейса через __declspec(uuid()). Это указание закопано глубоко в недрах define'ов, один из которых генерит midl для интерфейсов (из idl файла). #import работает аналогично. Интерфейс же IContextMenu определен не через idl, а отписан руками в хидере shlobj.h, и там этого __declspec нету (иногда у MS бывают на редкость кривые руки COM_INTERFACE_ENTRY_IID получает GUID явно первым параметром |
| Автор: Andrey44 21.11.2008, 11:08 |
| xvr, спасибо за разъяснение. |