Re[3]: MSHTML, IServiceProvider, IBindHost
От: al Россия  
Дата: 28.06.05 10:49
Оценка: 17 (2)
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


Re[3]: MSHTML, IServiceProvider, IBindHost
От: AndrewJD США  
Дата: 28.06.05 11:10
Оценка: 2 (1)
Здравствуйте, Vishen, Вы писали:


V>Я наврал Windows Media Player подхватывается.

V>Не подхватывается flash

V>Причина похоже в том что flash как-то по-своему закачевает свой контент.

V>И это очень обидно.

V>А протокол импользуется свой "eBook" — только насколько я понимаю это ниначто не влияет....

Фишка в том, что флешь работает ТОЛЬКО с "http://" и "file://" протоколами.
Если ты хостишь флешь в своем приложении подменить http протокол непроблема.


V>Может быть кто-нибудь знает как подпихнуть flash ActiveX свой стрим?


CAxWindow не использывал для хостинга флеша.
Писал свой хост, который поддерживает всего несколько интерфейсов и IBindHost запрашивался.

        COM_INTERFACE_ENTRY(IOleClientSite)
        COM_INTERFACE_ENTRY(IOleControlSite)
        COM_INTERFACE_ENTRY(IOleInPlaceSiteEx)
        COM_INTERFACE_ENTRY2(IOleInPlaceSite, IOleInPlaceSiteEx)
        COM_INTERFACE_ENTRY(IServiceProvider)
        COM_INTERFACE_ENTRY(IBindHost)



Попробуй устанавливать IBindHost не через IObjectWithSite, а IOleObject::SetClientSite — хотя не думаю, что будет рзница.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
MSHTML, IServiceProvider, IBindHost
От: Vishen  
Дата: 27.06.05 07:49
Оценка:
Нужно подсовывать бровзеру конетент из своего стореджа.
Сначала использовал Asynchronous Pluggable Protocols — но с ним не могут работать flash, windows media....
Теперь пытаюсь подсунуть свой IBindHost. Подсовываю свою реализацию IServiceProvider — но у нее в QueryService пытатся запросить все что угодно только не IBindHost.


Немного кода (реализация IServiceProvider):


class ATL_NO_VTABLE CMySite : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CMySite, &CLSID_MySite>,
    public IMySite,
    public IServiceProviderImpl<CMySite>,
    public IBindHost
{
//IBindHost
    STDMETHOD(CreateMoniker)( 
         LPOLESTR szName,
         IBindCtx *pBC,
         IMoniker **ppmk,
         DWORD dwReserved);
    
    STDMETHOD(MonikerBindToStorage)( 
         IMoniker *pMk,
         IBindCtx *pBC,
         IBindStatusCallback *pBSC,
         REFIID riid,
         void **ppvObj);
    
    STDMETHOD(MonikerBindToObject)( 
         IMoniker *pMk,
         IBindCtx *pBC,
         IBindStatusCallback *pBSC,
         REFIID riid,
         void **ppvObj);

//IMySite
    STDMETHOD(put_ServiceProvider)(/*[in]*/ IUnknown* newVal);
    STDMETHOD(put_OleClientSite)(/*[in]*/ IUnknown* newVal);

DECLARE_REGISTRY_RESOURCEID(IDR_MYSITE)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CMySite)
    COM_INTERFACE_ENTRY(IMySite)
    COM_INTERFACE_ENTRY(IServiceProvider)
    COM_INTERFACE_ENTRY(IBindHost)
END_COM_MAP()

BEGIN_SERVICE_MAP(CMySite)
    SERVICE_ENTRY(IID_IServiceProvider);
    SERVICE_ENTRY(SID_IBindHost);
END_SERVICE_MAP()
};



Немного кода (подсовывание IServiceProvider):


    CAxWindow::QueryControl(&m_spWebBrowser);
    m_spMySite.CoCreateInstance(__uuidof(E4Lib::MySite));

    CComPtr<IOleObject> spOleObject;
    HRESULT hr = m_spWebBrowser.QueryInterface(&spOleObject);
    CComPtr<IObjectWithSite> spObjectWithSite;
    hr = QueryHost(&spObjectWithSite);
    CComPtr<IUnknown> spUnknown;
    hr = m_spMySite.QueryInterface(&spUnknown);
    hr = spObjectWithSite->SetSite(spUnknown);
    CComVariant varEmpty;
        hr = m_spWebBrowser->Navigate(CComBSTR(sUrl),&varEmpty,&varEmpty,&varEmpty,&varEmpty);




Если у кого какие идеи/советы есть — подскажите пожалуйста...
Зарание благодарен.
Re: MSHTML, IServiceProvider, IBindHost
От: AndrewJD США  
Дата: 27.06.05 13:02
Оценка:
Здравствуйте, 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."
Re[2]: MSHTML, IServiceProvider, IBindHost
От: Vishen  
Дата: 27.06.05 19:13
Оценка:
V>>Нужно подсовывать бровзеру конетент из своего стореджа.
V>>Сначала использовал Asynchronous Pluggable Protocols — но с ним не могут работать flash, windows media....

AJD>А почему не работает Asynchronous Pluggable Protocols ? В чем причина? Какой протокол использовался?



Я наврал Windows Media Player подхватывается.
Не подхватывается flash

Причина похоже в том что flash как-то по-своему закачевает свой контент.
И это очень обидно.

Может быть кто-нибудь знает как подпихнуть flash ActiveX свой стрим?


А протокол импользуется свой "eBook" — только насколько я понимаю это ниначто не влияет....
Re[4]: MSHTML, IServiceProvider, IBindHost
От: Vishen  
Дата: 28.06.05 11:25
Оценка:
V>>А протокол импользуется свой "eBook" — только насколько я понимаю это ниначто не влияет....
AJD>Фишка в том, что флешь работает ТОЛЬКО с "http://" и "file://" протоколами.
AJD>Если ты хостишь флешь в своем приложении подменить http протокол непроблема.


V>>Может быть кто-нибудь знает как подпихнуть flash ActiveX свой стрим?


AJD>CAxWindow не использывал для хостинга флеша.


До этого допер...
Начал хостить не MSHTML а сам флаш.
На первый взляд хватило двух интерфейсов IServiceProvider и IBindHost.

AJD>Писал свой хост, который поддерживает всего несколько интерфейсов и IBindHost запрашивался.


AJD>
AJD>        COM_INTERFACE_ENTRY(IOleClientSite)
AJD>        COM_INTERFACE_ENTRY(IOleControlSite)
AJD>        COM_INTERFACE_ENTRY(IOleInPlaceSiteEx)
AJD>        COM_INTERFACE_ENTRY2(IOleInPlaceSite, IOleInPlaceSiteEx)
AJD>        COM_INTERFACE_ENTRY(IServiceProvider)
AJD>        COM_INTERFACE_ENTRY(IBindHost)

AJD>



JD>Попробуй устанавливать IBindHost не через IObjectWithSite, а IOleObject::SetClientSite — хотя не думаю, что будет рзница.


Пробывал — неполучается


Сейчас как запосной вариант остается попытатся проинумерится по всем <object> в штмле.
Поискать в них flash и попытатся подпихунть ему свой IServiceProvider.
Только как то много проблем возникает:
1) Не ясно когде это делать что бы успеть подпихуть свой IServiceProvider до того как флаш начнет качать свой контент,
2) Не ясно как вообще дайденым флешам подпихуть свой IServiceProvider.

Но полюбому если собирусь писать гуи на flash'e теперь знаю как это делать
Re[4]: MSHTML, IServiceProvider, IBindHost
От: Vishen  
Дата: 28.06.05 11:29
Оценка:
Здравствуйте, al, Вы писали:

просто — нужно подсунить свой 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



Посмотрим

Еще раз спасибо. Очень похоже что это имено то что мне нужно.
Re[5]: MSHTML, IServiceProvider, IBindHost
От: AndrewJD США  
Дата: 28.06.05 11:34
Оценка:
Здравствуйте, 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."
Re[4]: MSHTML, IServiceProvider, IBindHost
От: AndrewJD США  
Дата: 28.06.05 12:00
Оценка:
Здравствуйте, 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."
Re[5]: MSHTML, IServiceProvider, IBindHost
От: al Россия  
Дата: 28.06.05 12:57
Оценка:
Да, но в некоторых ситуациях (например, при вызове URLDownloadToFile()) URL-моникеры требуют от протокола создания файла в кеше IE. Для этого используется флаг BINDF_NEEDFILE. После создания файла протокол должкен сообщить об этом моникеру через ReportProgress(BINDSTATUS_CACHEFILENAMEAVAILABLE, ....). Домашнее задание — попробуй написать Pluggable Protocol, не создающий файлов на диске, и работающий через URLDownloadToFile().


Re[6]: MSHTML, IServiceProvider, IBindHost
От: Vishen  
Дата: 28.06.05 13:31
Оценка:
Здравствуйте, AndrewJD, Вы писали:

V>>2) Не ясно как вообще дайденым флешам подпихуть свой IServiceProvider.


AJD>А какая задача стоит? Хостить флешь или хостить MSHTML c флешиной?


Ну да...
Написание прокси, перехват сокетов, апи, и тп. некатит — хочется цивилищованым способом...
Re[7]: MSHTML, IServiceProvider, IBindHost
От: AndrewJD США  
Дата: 28.06.05 13:52
Оценка:
Здравствуйте, Vishen, Вы писали:

AJD>>А какая задача стоит? Хостить флешь или хостить MSHTML c флешиной?


V>Ну да...


Ну да, что?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[8]: MSHTML, IServiceProvider, IBindHost
От: Vishen  
Дата: 28.06.05 14:11
Оценка:
AJD>>>А какая задача стоит? Хостить флешь или хостить MSHTML c флешиной?

V>>Ну да...


AJD>Ну да, что?


Совсем туплю
Хочется хостить MSHTML на котором помимо всего прочего может быт флешка.
Re[9]: MSHTML, IServiceProvider, IBindHost
От: AndrewJD США  
Дата: 28.06.05 14:35
Оценка:
Здравствуйте, 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."
Re[10]: MSHTML, IServiceProvider, IBindHost
От: Vishen  
Дата: 29.06.05 07:26
Оценка:
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 подписывается на евенты контролов. Вообщем тоже нефонтан...
Re[11]: MSHTML, IServiceProvider, IBindHost
От: AndrewJD США  
Дата: 29.06.05 10:22
Оценка:
Здравствуйте, 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."
Re[11]: MSHTML, IServiceProvider, IBindHost
От: al Россия  
Дата: 29.06.05 10:33
Оценка:
V>Уже воспользовался первым. Все хорошо за исключением того что писал al: для flash и WMP нужно обрабатывать флаг BINDF_NEEDFILE и создавать файл на диске. Не очень мне это нравится но время уже поджимает...


BINDF_NEEDFILE нужен не только флешу. Из последнего — есть Word-документ, сохраненный в html и использующий в своих дебрях VML. Он нормально отображается при использовании APP, НО! при выводе на ПЕЧАТЬ картинки не печатаются, если для них не обрабатывать BINDF_NEEDFILE.

Еще примерчик: MSXML любой версии не будет загружать xml в случае async=false если не обрабатываеть BINDF_NEEDFILE. Самое интересное, что в случае async=true — все OK. http://support.microsoft.com/default.aspx?scid=kb;en-us;272359


Re: MSHTML, IServiceProvider, IBindHost
От: DenisTR  
Дата: 19.09.05 19:35
Оценка:
У меня та же фигня. а css файлы у тебя нормально подгружаются? у меня не палит почему-то
Re[3]: MSHTML, IServiceProvider, IBindHost
От: DenisTR  
Дата: 19.09.05 19:39
Оценка:
Здравствуйте, Vishen, Вы писали:

У меня та же фигня. а css файлы у тебя нормально подгружаются? у меня не палит почему-то

В IInternetProtocol::Start заходит, я в Stream загоняю. но стили никак не меняются
Re[4]: MSHTML, IServiceProvider, IBindHost
От: Nikolaz Германия www.nikeware.com
Дата: 13.11.06 09:33
Оценка:
Здравствуйте, DenisTR, Вы писали:

DTR>У меня та же фигня. а css файлы у тебя нормально подгружаются? у меня не палит почему-то


Вроде здесь решение похожей проблемы:
http://www.rsdn.ru/Forum/Message.aspx?mid=2205705&amp;pg=2
Автор: Tom
Дата: 09.11.06
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.