пятница, 28 марта 2008 г.

Обработка ссылок в системе

Проблема: есть программа, которая генерирует ссылки на свои объекты в некотором формате (например http://sample.ru/object.aspx?sys=sys_code&id=object_id ) при этом происходит обращение к веб-серверу, который возвращает файл с некоторым MIME типом, открываемый на клиенте зарегистрированной для этого типа программой (например, некоторым обработчиком объектов данной программы). Изменить формат ссылок нельзя, но вся необходимая для открытия объекта информация содержится непосредственно в ссылке.
Как одно из решений - написание расширений для браузеров, которое будет отрезать обращение к серверу для ссылок определенного формата и обрабатывать их самостоятельно.
  • IE: решением для IE было бы создание Asynchronus Pluggable Protocol, но такое решение сталкивается с несколькими проблемами. Такое решение будет работать только если браузером по умолчанию стоит IE. Сложно писать (все таки ActiveX). Проблемы при установке. Проблемы при открытии ссылок из сторонних приложений.
  • Firefox: для firefox все несколько проще. можно навеситься на событие ввода адреса в строку адреса и на событие загрузки браузера. А с помощью XUL можно запустить произвольное прилоджение
  • Opera: Для этого браузера сделать подобный перехват не удастся. браузер конечно поддерживает пользовательские скрипты и плагины, но навеситься на перехват перехода по ссылке я не смог, кроме того, я не смог из пользовательского скрипта запустить внешнее приложение или обратиться к COM классам.
Однако, писать плагины под каждый браузер - несколько нелепо. Ведь обработка гиперссылок может по разному обрабатываться внутри приложений, а при передаче гиперссылок должны отрабатывать одни и те же системные механизмы. Универсальным решением все таки стала бы обработка имено таких событий.
Как я понял, в Windows обработкой гиперссылок занимается модуль urlmon.dll. Он же вызывает методы интерфейса IInternetProtocol и IInternetProtocolSink для Asynchronus Pluggable Protocol.
Универсального решения проблемы я так и не нашел. Если кто нибудь знаешь в какую сторону копать - подскажите плз.

Комментариев нет: