Flash содержит в себе проверку имени протокола, по которому идет закачка, и не понимает ничего, кроме http://, file://, mk:@MSITStore и т.п. (полный список можно увидеть во flash.ocx). Обмануть его просто — нужно подсунить свой namespace-handler, например, для http://B689B315_1CB3_454e_956C_662B60FCB626.com/.... (см. IInternetSession::RegisterNameSpace). Конечно, это уже не так красиво, как свое имя для схемы, но flash начинает шевелиться и вызывать методы IInternetProtocol.
Но есть и вторая проблема. Flash использует что-то типа API URLDownloadToFile(), а эта функция (как и ее сетстры URLOpenStream и т.п.) требует, чтобы обработчик протокола обрабатывал флаг BINDF_NEEDFILE и создавал файл в кеше IE. Я видел только одинг пример протокола, обрабатывающего этот флаг: RES2 — http://www.harper.no/valery/oldsite/default.htm
V>Я наврал Windows Media Player подхватывается. V>Не подхватывается flash
V>Причина похоже в том что flash как-то по-своему закачевает свой контент. V>И это очень обидно.
V>А протокол импользуется свой "eBook" — только насколько я понимаю это ниначто не влияет....
Фишка в том, что флешь работает ТОЛЬКО с "http://" и "file://" протоколами.
Если ты хостишь флешь в своем приложении подменить http протокол непроблема.
V>Может быть кто-нибудь знает как подпихнуть flash ActiveX свой стрим?
CAxWindow не использывал для хостинга флеша.
Писал свой хост, который поддерживает всего несколько интерфейсов и IBindHost запрашивался.
Нужно подсовывать бровзеру конетент из своего стореджа.
Сначала использовал Asynchronous Pluggable Protocols — но с ним не могут работать flash, windows media....
Теперь пытаюсь подсунуть свой IBindHost. Подсовываю свою реализацию IServiceProvider — но у нее в QueryService пытатся запросить все что угодно только не IBindHost.
Здравствуйте, Vishen, Вы писали:
V>Нужно подсовывать бровзеру конетент из своего стореджа. V>Сначала использовал Asynchronous Pluggable Protocols — но с ним не могут работать flash, windows media....
А почему не работает Asynchronous Pluggable Protocols ? В чем причина? Какой протокол использовался?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
V>>Нужно подсовывать бровзеру конетент из своего стореджа. V>>Сначала использовал Asynchronous Pluggable Protocols — но с ним не могут работать flash, windows media....
AJD>А почему не работает Asynchronous Pluggable Protocols ? В чем причина? Какой протокол использовался?
Я наврал Windows Media Player подхватывается.
Не подхватывается flash
Причина похоже в том что flash как-то по-своему закачевает свой контент.
И это очень обидно.
Может быть кто-нибудь знает как подпихнуть flash ActiveX свой стрим?
А протокол импользуется свой "eBook" — только насколько я понимаю это ниначто не влияет....
V>>А протокол импользуется свой "eBook" — только насколько я понимаю это ниначто не влияет.... AJD>Фишка в том, что флешь работает ТОЛЬКО с "http://" и "file://" протоколами. AJD>Если ты хостишь флешь в своем приложении подменить http протокол непроблема.
V>>Может быть кто-нибудь знает как подпихнуть flash ActiveX свой стрим?
AJD>CAxWindow не использывал для хостинга флеша.
До этого допер...
Начал хостить не MSHTML а сам флаш.
На первый взляд хватило двух интерфейсов IServiceProvider и IBindHost.
AJD>Писал свой хост, который поддерживает всего несколько интерфейсов и IBindHost запрашивался.
AJD>
JD>Попробуй устанавливать IBindHost не через IObjectWithSite, а IOleObject::SetClientSite — хотя не думаю, что будет рзница.
Пробывал — неполучается
Сейчас как запосной вариант остается попытатся проинумерится по всем <object> в штмле.
Поискать в них flash и попытатся подпихунть ему свой IServiceProvider.
Только как то много проблем возникает:
1) Не ясно когде это делать что бы успеть подпихуть свой IServiceProvider до того как флаш начнет качать свой контент,
2) Не ясно как вообще дайденым флешам подпихуть свой IServiceProvider.
Но полюбому если собирусь писать гуи на flash'e теперь знаю как это делать
просто — нужно подсунить свой namespace-handler, например, для al>http://B689B315_1CB3_454e_956C_662B60FCB626.com/.... (см. IInternetSession::RegisterNameSpace). Конечно, это уже не так красиво, как свое имя для схемы, но flash начинает шевелиться и вызывать методы IInternetProtocol.
Ух ты!
Спасибо.
Мне побоку будет схема или будет namespace — главное что бы не нужно было flash в темп распаковывать
al>Но есть и вторая проблема. Flash использует что-то типа API URLDownloadToFile(), а эта функция (как и ее сетстры URLOpenStream и т.п.) требует, чтобы обработчик протокола обрабатывал флаг BINDF_NEEDFILE и создавал файл в кеше IE. Я видел только одинг пример протокола, обрабатывающего этот флаг: RES2 — http://www.harper.no/valery/oldsite/default.htm
Посмотрим
Еще раз спасибо. Очень похоже что это имено то что мне нужно.
Здравствуйте, Vishen, Вы писали:
V>Сейчас как запосной вариант остается попытатся проинумерится по всем <object> в штмле. V>Поискать в них flash и попытатся подпихунть ему свой IServiceProvider. V>Только как то много проблем возникает: V>1) Не ясно когде это делать что бы успеть подпихуть свой IServiceProvider до того как флаш начнет качать свой контент, V>2) Не ясно как вообще дайденым флешам подпихуть свой IServiceProvider.
А какая задача стоит? Хостить флешь или хостить MSHTML c флешиной?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, al, Вы писали:
al>Flash содержит в себе проверку имени протокола, по которому идет закачка, и не понимает ничего, кроме http://, file://, mk:@MSITStore и т.п. (полный список можно увидеть во flash.ocx). Обмануть его просто — нужно подсунить свой namespace-handler, например, для al>http://B689B315_1CB3_454e_956C_662B60FCB626.com/.... (см. IInternetSession::RegisterNameSpace). Конечно, это уже не так красиво, как свое имя для схемы, но flash начинает шевелиться и вызывать методы IInternetProtocol.
al>Но есть и вторая проблема. Flash использует что-то типа API URLDownloadToFile(), а эта функция (как и ее сетстры URLOpenStream и т.п.) требует, чтобы обработчик протокола обрабатывал флаг BINDF_NEEDFILE и создавал файл в кеше IE. Я видел только одинг пример протокола, обрабатывающего этот флаг: RES2 — http://www.harper.no/valery/oldsite/default.htm
Сам флешь ничего не требует и сам не качает. Он пользуется обычными URL moniker'ами
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Да, но в некоторых ситуациях (например, при вызове URLDownloadToFile()) URL-моникеры требуют от протокола создания файла в кеше IE. Для этого используется флаг BINDF_NEEDFILE. После создания файла протокол должкен сообщить об этом моникеру через ReportProgress(BINDSTATUS_CACHEFILENAMEAVAILABLE, ....). Домашнее задание — попробуй написать Pluggable Protocol, не создающий файлов на диске, и работающий через URLDownloadToFile().
Здравствуйте, AndrewJD, Вы писали:
V>>2) Не ясно как вообще дайденым флешам подпихуть свой IServiceProvider.
AJD>А какая задача стоит? Хостить флешь или хостить MSHTML c флешиной?
Здравствуйте, Vishen, Вы писали:
V>Хочется хостить MSHTML на котором помимо всего прочего может быт флешка.
Имхо два наиболее простых пути:
1) Использовать APP протоколы, добовляя к стандартному префикс.
2) Сделать wraper котрый реализует IOleClientSite и IServiceProvider. Пройтись по всем контролам и установить через IOleObject::SetClientSite ссылку на свой обьект.
Твой обьект будет делегировать все вызовы оригинальной реализации IOleClientSite, кроме IOleClientSite::GetMoniker, где надо вернуть E_NOTIMPL (после чего флешь должен запросить IServiceProvider). По идее должно работать.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
AJD>Имхо два наиболее простых пути:
AJD>1) Использовать APP протоколы, добовляя к стандартному префикс.
AJD>2) Сделать wraper котрый реализует IOleClientSite и IServiceProvider. Пройтись по всем контролам и установить через IOleObject::SetClientSite ссылку на свой обьект.
AJD>Твой обьект будет делегировать все вызовы оригинальной реализации IOleClientSite, кроме IOleClientSite::GetMoniker, где надо вернуть E_NOTIMPL (после чего флешь должен запросить IServiceProvider). По идее должно работать.
Уже воспользовался первым. Все хорошо за исключением того что писал al: для flash и WMP нужно обрабатывать флаг BINDF_NEEDFILE и создавать файл на диске. Не очень мне это нравится но время уже поджимает...
По поводу второго варианта не совсем ясно когда подпихивать свой сайт контролам. Придумал еще и третий вариант тоже кривоваватый. В html'е редактировать все <object> и создавать прокси activex. Который уже будет создвать нужные котнролы и давать им свою реализацию IBindHost. Но тогда нужно будет как то извратится если HTML подписывается на евенты контролов. Вообщем тоже нефонтан...
Здравствуйте, Vishen, Вы писали:
V>Уже воспользовался первым. Все хорошо за исключением того что писал al: для flash и WMP нужно обрабатывать флаг BINDF_NEEDFILE и создавать файл на диске. Не очень мне это нравится но время уже поджимает...
Т.е. без BINDF_NEEDFILE ничего не работает?
V>По поводу второго варианта не совсем ясно когда подпихивать свой сайт контролам.
можно попробывать на разные события типа navigate complete, status changed etc.
V>Придумал еще и третий вариант тоже кривоваватый. В html'е редактировать все <object> и создавать прокси activex. Который уже будет создвать нужные котнролы и давать им свою реализацию IBindHost. Но тогда нужно будет как то извратится если HTML подписывается на евенты контролов. Вообщем тоже нефонтан...
Я не стал предлагать этот способ, потому что непонятно было откуда html приходит
Я так делал, н\в принципе никаких проблем замечено небыло.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
V>Уже воспользовался первым. Все хорошо за исключением того что писал al: для flash и WMP нужно обрабатывать флаг BINDF_NEEDFILE и создавать файл на диске. Не очень мне это нравится но время уже поджимает...
BINDF_NEEDFILE нужен не только флешу. Из последнего — есть Word-документ, сохраненный в html и использующий в своих дебрях VML. Он нормально отображается при использовании APP, НО! при выводе на ПЕЧАТЬ картинки не печатаются, если для них не обрабатывать BINDF_NEEDFILE.