C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Context Menu Handler(Windows Shell Extenstensions)
arist77
Отправлено: 27.08.2004, 18:04


Не зарегистрирован







Начитавшись MSDN понял, что для расширения Windows Shell, а именно контекстных меню (конкретно — объектов файловой системы) нужно написать COM-сервер, реализующий интерфейсы IContextMenu, IShellExtInit, IClassFactory, естественно IUnknown.
IClassFactory и IUnknown реализовал без проблем.
За IContextMenu ещё не брался, пока дошел до IShellExtInit::Initialize:
Сразу заметил такую вещь — этот метод вызывается несколько раз при однократном правом щелчке мыши на файле или папке в Проводнике(?).
В MSDN написано, что в параметре pidlFolder (типа LPCITEMIDLIST) передаётся путь до папки или файла (правда в несколько другом виде чем строка), но у меня этот параметр всегда == 0.
Ладно, смотрим следующий параметр pdtobj (типа IDataObject *).
Радует то, что он != 0. Вызываем методы EnumFormatEtc, GetData (из IDataObject) короче ковыряемся всяко разно. Вроде всё работает.
Но как выковырять из всего этого всего лишь путь в виде строки???!
Вызов GetData возвращает в одном из параметров указатель на структуру STGMEDIUM. В ней поле tymed. У меня оно всегда == TYMED_HGLOBAL.
Что делать дальше не знаю уже пару дней. Зачем мне этот HGLOBAL?
Вообще поможет ли он в нахождении пути?
Короче, что делать дальше?

Вообще задача такая: нужно внедриться в Проводник (Windows Shell) и вставлять свою команду в контекстное меню тогда когда надо. Когда надо определяется на основе того, что выбрано папка, файл или несколько объектов. Короче аналог WinRARа он ведь тоже сначала смотрит что выделено, а потом добавляет в меню допустимые команды.
arist77
Отправлено: 30.08.2004, 18:45


Не зарегистрирован







Ответ на мой вопрос (кому интересно):
При вызове GetData в структуре FORMATETC в полях tymed и cfFormat нужно указать соответственно TYMED_HGLOBAL и CF_HDROP, GetData возвращает в параметре указатель на STGMEDUIM, далее...
вызываем GlobalLock(STGMEDIUM::hGlobal) и результат...
по идее преобразуем в HDROP, но...
мы сразу преобразуем его в DROPFILES *.
А DROPFILES::pFiles есть указатель (смещение от начала DROPFILES) на список файлов (выделенных, например в Проводнике), разделённых '\0' и заканчивающийся "\0\0".

Появилась новая проблема:
реализация метода IContextMenu::QueryContextMenu.
Его вызов почему-то всегда происходит с uFlags&&CMF_DEFAULTONLY == true, а это не есть то что я ожидал.
Кому интересно могу сообщать о своих исследованиях на эту тему.

Вернуться в Технологии COM/DCOM, ActiveX