Pluggable MIME-Filter для IE

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Pluggable MIME-Filter для IE

Сообщение iGrok » 06.03.2009 (Пт) 22:08

Понадобилось сделать такую вот штуковину.

Поиски дали следующее:
http://msdn.microsoft.com/en-us/library/aa767916(VS.85).aspx
и
viewtopic.php?f=1&t=9318&p=55776

Собственно, всё замечательно. :)
Но из опыта работы с COM у меня только библиотечка-расширение для 1С, имплементящая две с половиной функции интерфейса, описанного в прилагавшейся к документации TLB.

Пока в активе - найденные :) olelib.tlb и olelib2.tlb с исходниками, и желание написать этот самый MIME-Filter. Чего же для этого надо сделать пока представляю слабо. Толкните, плиз, в нужном направлении. :)

З.Ы. В принципе, есть у меня "чужая"(откопанная где-то на необъятных просторах винта) библиотечка, которая для этого изначально предназначалась. И даже, судя по всему, в ней всё что нужно есть (я точно помню, что она работала, и даже что-то фильтровала). Всё бы замечательно, но мне пока совершенно непонятно, как использовать хотя бы её. Дело осложняется тем, что мне нужно, чтобы фильтр работал "временно". Т.е. запущено приложение-контроллер. Пока оно работает - работает и фильтр. Как только прекратило - фильтр отключается.

Наткнулся на такой пример:
Код: Выделить всё
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            'CComPtr<IInternetSession> m_spSession ;
            Dim m_spSession As UrlMon.IInternetSession
            'CComPtr<IClassFactory>      m_spClassFactoryMime ;
            Dim m_spClassFactoryMime As UrlMon.IClassFactory
            'hr = ::CoGetClassObject( CLSID_MimeFilter, CLSCTX_SERVER,
            '                                                                        NULL, IID_IClassFactory,
            '                                          (void**)&m_spClassFactoryMime );
            m_spClassFactoryMime = CoGetClassObject(GetStdGUID("FC3BAAF1-AD41-4141-BC28-5167E29E3B14"), CLSCTX.CLSCTX_SERVER, _
                  IntPtr.Zero, GetStdGUID("00000001-0000-0000-C000-000000000046"))
            'if( hr == S_OK )
            '{
            '            if( ::CoInternetGetSession( 0, &m_spSession, 0) ==S_OK )
            CoInternetGetSession(0, m_spSession, 0)
            '            {
            '                           m_spSession->RegisterMimeFilter(m_spClassFactoryMime,
            '                                                                     CLSID_MimeFilter,
            '                                                                     L"text/html" );
            m_spSession.RegisterMimeFilter(m_spClassFactoryMime, New Guid("FC3BAAF1-AD41-4141-BC28-5167E29E3B14"), "text/html")
            '            }
            '}
            Me.AxWebBrowser1.Navigate("http://gouki/alieni.htm")
      End Sub


Перевёл его на VB. Он "работает" (по крайней мере result'ы всех вызываемых ф-ции - S_OK) Но ничего не происходит. Т.е. IE как отображал то, что эта библа фильтрует, так и отображает..
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Pluggable MIME-Filter для IE

Сообщение Хакер » 06.03.2009 (Пт) 23:40

1) Речь о MIME-filter или о Protocol handler?
2) Если я не ошибаюсь, Antonariy столкнулся с похожей проблемой.

Есть, вероятно, какие-то огрехи в реализации COM-вызовов в VB, и причиной происходящего являются именно такие огрехи. В частности, я столкнулся с тем, что из VB обламывается вызов ITypeLib::SaveAllChanges(), хотя прекрасно работал из сей.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Pluggable MIME-Filter для IE

Сообщение iGrok » 07.03.2009 (Сб) 12:59

Речь всё-таки о MIME-Filter. А у Antonariy был Protocol Handler.

Ладно, попробуем с нуля.

Погуглив, понял что мне нужно реализовать 3 интерфейса. Если точнее, то вообще всего 4 метода трёх интерфейсов:
IInternetProtocolRoot::Start
IInternetProtocolSink::ReportProgress
IInternetProtocolSink::ReportData
IInternetProtocol::Read

Вопрос первый:
Я правильно понимаю, что я могу сделать ОДИН класс, который будет имплементить эти 4 метода трёх интерфейсов, а на всё остальное, сделав "морду кирпичём" отвечать Err.Raise E_NOTIMPL?

Вопрос второй:
MSDN писал(а):All asynchronous pluggable MIME filters must support the BINDF_NO_UI and BINDF_SILENTOPERATION flags.

А это вообще о чём?

И Вопрос третий:
В том же MSDN полностью описан процесс создания Protocol Handler'а.
А дальше сказано, что:
MSDN писал(а):A pluggable MIME filter is essentially an asynchronous pluggable protocol handler that implements an IInternetProtocolSink interface. Urlmon.dll uses the pluggable MIME filter's implementation of IInternetProtocolSink to notify the filter that Urlmon.dll has data ready to be filtered.

Я правильно понимаю, что мне всё-таки нужно сначала полностью реализовать ProtocolHandler, и потом уже надстраивать туда IInternetProtocolSink, для реализации MIME-Filter?
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Pluggable MIME-Filter для IE

Сообщение Хакер » 07.03.2009 (Сб) 13:41

iGrok писал(а):Я правильно понимаю, что я могу сделать ОДИН класс, который будет имплементить эти 4 метода трёх интерфейсов, а на всё остальное, сделав "морду кирпичём" отвечать Err.Raise E_NOTIMPL?
С точки зрения COM — можно.
Мне кажется (после того как глянул в MSDN, за что отвечают эти методы), что ещё и IInternetProtocolRoot::Abort, IInternetProtocolRoot::Continue, IInternetProtocolRoot::Terminate надо реализовать, т.к. их будут вызывать с целью произвести довольно важные действия, т.е. явно ожидая, что они реализованы. Resume и Suspend — однозначно E_NOTIMPL.
Мне кажется, что у остальных интерфейсов надо вообще реализовать всё.

iGrok писал(а):Вопрос второй:
MSDN писал(а):All asynchronous pluggable MIME filters must support the BINDF_NO_UI and BINDF_SILENTOPERATION flags.

А это вообще о чём?

Флаги биндинга. Значит, что не должно быть показано никакого UI, никаких звуков, никаких, в общем, внешних проявлений быть не должно, потому как может привести к нехорошим последствиям. См. доку по моникерам.

iGrok писал(а):Я правильно понимаю, что мне всё-таки нужно сначала полностью реализовать ProtocolHandler, и потом уже
надстраивать туда IInternetProtocolSink, для реализации MIME-Filter?

Не знаю, никогда не заглядывал в эту область.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Pluggable MIME-Filter для IE

Сообщение iGrok » 09.03.2009 (Пн) 23:00

Так. Ну, поехали:

Лирика:
iGrok писал(а):...Если точнее, то вообще всего 4 метода трёх интерфейсов:
IInternetProtocolRoot::Start
IInternetProtocolSink::ReportProgress
IInternetProtocolSink::ReportData
IInternetProtocol::Read

Похоже из них нужны только два интерфейса: IInternetProtocol и IInternetProtocolSink. Ибо обращений к методам IInternetProtocolRoot попросту нету. Метода нужно только два - IInternetProtocol::Start и IInternetProtocol::Read. Все обращения к IInternetProtocolSink просто транслируются на интерфейс, полученный от IE в методе Start. Пока реализацию IInternetProtocolRoot вообще убирать не пробовал, когда доделаю всё остальное попробую..

iGrok писал(а):И Вопрос третий:
В том же MSDN полностью описан процесс создания Protocol Handler'а.
А дальше сказано, что:
MSDN писал(а):A pluggable MIME filter is essentially an asynchronous pluggable protocol handler that implements an IInternetProtocolSink interface. Urlmon.dll uses the pluggable MIME filter's implementation of IInternetProtocolSink to notify the filter that Urlmon.dll has data ready to be filtered.

Я правильно понимаю, что мне всё-таки нужно сначала полностью реализовать ProtocolHandler, и потом уже надстраивать туда IInternetProtocolSink, для реализации MIME-Filter?

Таки не надо делать никаких Protocol Handler'ов. Что радует.

Что ещё радует, глюков, подобных тем, с которыми столкнулся Antonariy, пока не наблюдается. Как, впрочем, и любых других. Работает как часы, спасибо майкрософтовскому примеру на c++ (потом выложу вместе со своим)..

А пока вопрос следующий:
Данные (HTML) приходят порциями. В среднем по 1-10кб.
Мне нужно находить там определённые участки кода (в основном скрипты, но не все, а по определённому шаблону - режем всякую дрянь со страниц), и заменять их на заглушки. Данные я вполне могу не отдавать сразу, а придержать до поступления очередной порции.
Чего же я ещё хочу для полного счастья? Хочу что-то типа парсера HTML, который мог бы парсить "неполный" код, при этом выявлять "незавершённые" элементы, и отделять их - их я буду придерживать до получения следующей порции данных, а остальное отдавать дальше.

Чёткого понимания, как лучше это сделать, у меня пока нет. Посему хочется советов и предложений. =)
А пока, параллельно с их ожиданием, может и сам чего придумаю.. )
label:
cli
jmp label

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Pluggable MIME-Filter для IE

Сообщение iGrok » 15.03.2009 (Вс) 3:07

В общем, ясно, что это никому не интересно. Но получившуюся штуку всё-таки выложу, как и обещал. Мало-ли, кому пригодится..

cpp_mimefilt - пример реализации фильтра на cpp.

VBMimeFilterSample - реализация на VB.

Код практически не комментирован, оптимизации не подвергался (а есть куда), за реализацию некоторых моментов готов сам себе публично оторвать любые две руки(на выбор) =)

Внутри:
VBMimeFilterSample - реализация интерфейсов фильтра для IE.
+modProtocolHandler - спёрт, кажется, у Edanmo (я брал из обсуждения Antonariy'евского ProtocolHandler'а). Нужен для того, чтобы в одном из методов IInternetProtocol можно было возвращать положительные значения. Подробности по ссылкам выше..

CLogger - не интересно. Простой логгер.

CStreamProcess - класс-буфер для получаемого кода + обработчик этого же кода. В Class_Initialize объявлены правила фильтрации. Чего с этим дальше делать, думаю, объяснять не надо..
Вложения
cpp_mimefilt.zip
cpp mime filter (Microsoft? sample)
(45.01 Кб) Скачиваний: 99
VBMimeFilterSample.zip
VB Mime Filter For IE
(214.05 Кб) Скачиваний: 86
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Pluggable MIME-Filter для IE

Сообщение Хакер » 15.03.2009 (Вс) 12:17

Мне интересно :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Pluggable MIME-Filter для IE

Сообщение iGrok » 15.03.2009 (Вс) 12:48

Хакер писал(а):Мне интересно :)

А скачиваний всё равно 0. :)

Короче, пример, по описанным в нём правилам, успешно фильтрует логотип яндекса со страницы http://yandex.ru, и кликандер от 1traff.ru (это такая дрянь для зарабатывания денег сайтовладельцами, когда кликаешь на любом месте толчто загруженного сайта, в фоне открывается страница с рекламой)..

А. Да. Чуть не забыл, как это всё вообще применять.
CLSID получившегося класса надо запихнуть вот сюда: HKEY_CLASSES_ROOT\PROTOCOLS\Filter\text/html
Ессесно, это можно сделать автоматом в установщике, или ещё как. Я для тестирования запихивал руками.

UPD:
А. И ещё. Изначально речь шла о фильтре, который бы "подключался на время" приложением-контроллером. Этого мне сделать так и не удалось, возможно и из-за огрех реализации COM в VB, о которых говорил Хакер во втором посте. Не знаю. Решилось тем, что в своём приложении активность фильтра я контроллирую значением в реестре, которое перечитываю при каждом вызове Class_Initialize..
В примере за это отвечает m_bProcessingEnabled в CStreamProcess.

З.Ы. По хорошему, в VBMimeFilterSample.Read в самом начале нужно добавить строку If m_IncomingProt Is Nothing Then Err.Raise E_FAIL: Exit Function
label:
cli
jmp label

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Pluggable MIME-Filter для IE

Сообщение iGrok » 19.03.2009 (Чт) 1:08

Обнаружился конкретный баг. После посещения некоторых сайтов (поскольку пишется резалка всякого рода рекламы, баннеров, и особенно порно/адалта - сайты соответствующие. Пример - http://tvserialy.net/) ие перестаёт фильтровать что бы то ни было до перезапуска. В логе - пусто. Т.е. первый раз при заходе на такой сайт всё обрезается хорошо лог создаётся, обновляем страницу, и получаем кукиш. После перезапуска IE всё опять хорошо. До следующего захода на такой сайт.

Отлов ошибок ни к чему ни привёл. Первый заход на сайт проходит полностью нормально. При обновлении экземпляр класса просто не создаётся (такое ощущение ибо в лог не попадают даже Class_Initialize/Terminate.
Пока подозрение на ошибки HTML, из-за которых что-то такое происходит при первом проходе.. Но что именно пока отловить не удаётся.

Мало того, такая штука происходит ДАЖЕ при прогоне без обработки. Т.е. когда мой обработчик служит просто "мостом", перенаправляющим вызовы от одного объекта другому..

Я в некоем замешательстве.. :( Но пока копаюсь дальше..
label:
cli
jmp label

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Pluggable MIME-Filter для IE

Сообщение iGrok » 20.03.2009 (Пт) 20:35

Ещё забавнее. Хватанул пример MIME-фильтра, написанного на cpp. Тот, правда, совсем с другим функционалом, сделан он для XML, так что выводит мне HTML-код сайта (ибо заменяет всякие там < на &lt; и т.п.), но реализация интерфейса там такая же.

Он на этих сайтах тоже ведёт себя странно - выдаёт 10-30% кода сайта. С конца. Ну если раза 3-4 сделать Ctrl-F5, тогда нормально всё. То есть обработчик по крайней мере не отрубается. Так что наверное буду переписывать на Cpp, взяв его код за основу.. Но всё-таки хотелось бы разобраться, от чего такое происходит.

З.Ы. Глюк есть только на IE6 (на 5ке не смотрел вообще), а не IE7 и IE8 всё ок. Ну как, "ок". Фильтр всё равно не срабатывает. Но по крайней мере не падает, и при переходе на другие сайты продолжает работать..
label:
cli
jmp label

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Pluggable MIME-Filter для IE

Сообщение iGrok » 26.03.2009 (Чт) 11:25

Блин.. :?

Я, может, чего не понимаю?
Взял тот самый пример от MS. Чуть-чуть переделал, для начала просто меняю по всему тексту символ 'а' на 'б'. (смотреть CXMLMimeFilterPP::Read).

Не работает. :?
Точнее, простые сайты, типа ya.ru нормально фильтруются. А вот после захода на, к примеру, yandex.ru - работать перестаёт.. Я вообще не понимаю, что просходит.. :?

Кто-нить из спецов по Cpp, посмотрите плиз?
Вложения
xmlmimetest.zip
(45.95 Кб) Скачиваний: 75
label:
cli
jmp label


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 33

    TopList