суббота, 30 мая 2009 г.

DropHandler (не доделал пока)

Началось всё с того, что я взял несколько сотен мегабайт музыки у моей девушки. Каково же было моё удивление, когда вместо фотографий альбомов, я обнаружил фотки подружек/одноклассниц/семьи. Задумался над тем, как же она выставляла все эти фотки. Сдаётся мне - каждую вручную через iTunes. Потом пошла мысль за мыслью об монотонных операциях, которые бы желательно сократить . . .

1. Рождение идеи

А ведь было бы гораздо проще и интуитивно понятнее, если бы можно было просто натащить фотку мышкой на мп3-шку. Действительно, просто хватаем, тащим мышой и отпускаем на нужной песне - бац фотка стала картинкой альбома.

2. Разведка обстановки

Сказано - сделано. Пошли копать под MS Explorer. Хватаю мышой JPG и тащу на MP3. И что я вижу? мп3-шке абсолютно пофигу все мои старания. Она просто прикидывается фоном, даже слушать не хочет ни про какую жпг. Погодите, а на кого вообще можно другие файлы перетаскивать? Метод простой проверки показал: EXE, CMD, COM, BAT, JS, VBS и конечно же фолдеры. Интересно знать, почему они реагируют на drag&drop, а остальные нет.

За ответом на этот вопрос идём в реестр в ветвь HKCR. Находим папку "HKCR/.exe", её значение по умолчанию "exefile". Теперь находим папку "HKCR/exefile" и видим всю информацию о возможных действиях с ехе-файлами. Бросается в глаза папка "HKCR/exefile/shellex/DropHandler", её имя говорит само за себя. Обработчик бросания - дословный перевод. Значение по умолчанию у этой ветви реестра - странный набор символов через дефис, заключённый в фигурные скобки. Где-то я такие уже видел . . .

А! Точно! В ветке "HKCR/CLSID" полным полно таких. CLSID - как пить дать Class ID. Внутри найденной ветви реестра видим путь к shell32.dll и еще один непонятный ключик ThreadingModel со значением Apartment. Теперь нам понятно, при перетаскивании любого объекта файловой системы на ехе-файл, будет вызываться один из методов динамической библиотеки shell32.dll

3. Принятие первичных мер

Создаём ветвь реестра "HKCR/.mp3/shellex/DropHandler" со значением по умолчанию как и у ехе-шника. Смотрим, что изменилось в проводнике. Хватаем картинку и тащим на мп3. И вот оно! MP3 файл выделяется как и EXE при натаскивании на него файла. Ну чтож, отпускаем. Как и ожидалось открылся плеер по умолчанию и стал проигрывать нашу песню. Ну а чего мы ещё хотели установив мп3-шке DropHandler от ехе-шки? Следующим этапом по логике вещей должно стать создание своего собственного DropHandler-а и получение его собственного CLSID.

4. Ныряем с головой

Ни разу ничего похожего не делал. Погуглил-погуглил и определился. Следует в MSVC создать проект ATL, как DLL. CLSID свежесозданной длл-ки я обнаружил прямо в исходном коде. Он сгенерировался в процессе создания проекта. Теперь следует найти в исходниках(а их не мало уже) основной класс и пронаследовать его от IDropHandler и IPersistFile. Придётся поставить порядка 12-ти методов-заглушек и только необходимые нам наделить логикой. Каждый раз при перекомпиляции проекта студия создаёт необходимые ветви реестра в "HKCR/CLSID" и "HKCR/AppID". Только внутри они пустые, я каждый раз заполнял их по примеру стандартного DropHandler-а shell32.dll. (А надо ли это было?)

// DropHandler всё ещё на операционном столе.
// Откликаться на дрэг пока не желает.
// Работа кипит.

5 комментариев:

student комментирует...

слушай!
если я единственный твой читатель!)
то тебе нужно проще описывать свои действия!но в целом я понял..да и помню как ты извращался в моем реестре

Анонимный комментирует...

После 2-х часов поисков, свершилось!
Я смог решить твою проблему! В нормальном HKCR\.mp3\shell\open\command юзай код %2 (процент 2), а как именно, читай в документации к плееру(я писал для маленькой программки, создающей VPF-файлы)!

Найти меня можно на http://vog-nevada.ucoz.com/ я там NevaDA

Анонимный комментирует...

Я думаю, что можно найти какую-нибудь программу, которая будет вкладывать в мп3шку картинку при помоши параметра запуска. Можно написать мини-программу с параметрами типа "FILE(%1)ADD(%2)", и если параметр ADD не равен пустым скобкам, запускать этот "вкладыватель", иначе - плеер. Единственный минус-замедление запуска мп3шек(из-за задержки в той программе).

Посмотри например http://voglink.ucoz.com/ (скачай и установи), он создаёт ассоциации с .VPF файлами, там хендлер по твоей идее, параметры себе возьми на заметку. Когда вернусь из отпуска, попробую написать тебе эту прогу для выбора
--
NevaDA

iB0BAH комментирует...

твой ATL объект нужно зарегистрировать в системе. я регистрировал свою dll командой regsvr32 в cmd. после этого работало.

[k06a] комментирует...

Думаешь имеет смысл поднимать исходники и доделывать?