Загрузить IHTMLDocument2 из IStream
От: leshka  
Дата: 24.01.02 13:06
Оценка:
Привет!

Как можно загрузить HTML-код в IHTMLDocument2, если HTML-код имеется в виде IStream?

Заранее благодарен.
Re: Загрузить IHTMLDocument2 из IStream
От: OlegO Россия http://www.mediachase.ru
Дата: 24.01.02 14:11
Оценка:
Здравствуйте leshka, Вы писали:

L>Привет!


L>Как можно загрузить HTML-код в IHTMLDocument2, если HTML-код имеется в виде IStream?


L>Заранее благодарен.


Не знаю, как именно со стримом

Советую посмотреть в MSDN "Loading HTML content from a Stream"
там все есть.

Шаги следующие:

— Navigating to about:blank
— Availability of the DHTML Object Model
— Using QueryInterface to Obtain the IPersistStreamInit Interface
— Using the IPersistStreamInit Interface to Load HTML Content
— Offline Reading
— Related Topics
С уважением, OlegO.
Re[2]: Загрузить IHTMLDocument2 из IStream
От: OlegO Россия http://www.mediachase.ru
Дата: 24.01.02 14:14
Оценка:
На строку:
OO>Не знаю, как именно со стримом
Переводить как: "знаю, как именно со стримом"
С уважением, OlegO.
Re[2]: Загрузить IHTMLDocument2 из IStream
От: OlegO Россия http://www.mediachase.ru
Дата: 24.01.02 14:22
Оценка: 15 (4)
// Собственно вот и сама функция, что-то с первого раза поленился послать

HRESULT LoadWebBrowserFromStream(IWebBrowser* pWebBrowser, IStream* pStream)
{
HRESULT hr;
IDispatch* pHtmlDoc = NULL;
IPersistStreamInit* pPersistStreamInit = NULL;

// Retrieve the document object.
hr = pWebBrowser->get_Document( &pHtmlDoc );
if ( SUCCEEDED(hr) )
{
// Query for IPersistStreamInit.
hr = pHtmlDoc->QueryInterface( IID_IPersistStreamInit, (void**)&pPersistStreamInit );
if ( SUCCEEDED(hr) )
{
// Initialize the document.
hr = pPersistStreamInit->InitNew();
if ( SUCCEEDED(hr) )
{
// Load the contents of the stream.
hr = pPersistStreamInit->Load( pStream );
}
pPersistStreamInit->Release();
}
}
}
С уважением, OlegO.
Re[3]: Загрузить IHTMLDocument2 из IStream
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.01.02 00:11
Оценка:
Здравствуйте OlegO, Вы писали:

Плиз, добавляй форматирование тегом "ccode"!


OO>// Собственно вот и сама функция, что-то с первого раза поленился послать :)

OO>HRESULT LoadWebBrowserFromStream(IWebBrowser* pWebBrowser, IStream* pStream)
OO>{
OO>HRESULT hr;
OO>IDispatch* pHtmlDoc = NULL;
OO>IPersistStreamInit* pPersistStreamInit = NULL;

OO>    // Retrieve the document object.
OO>    hr = pWebBrowser->get_Document( &pHtmlDoc );
OO>    if ( SUCCEEDED(hr) )
OO>    {
OO>        // Query for IPersistStreamInit.
OO>        hr = pHtmlDoc->QueryInterface( IID_IPersistStreamInit,  (void**)&pPersistStreamInit );
OO>        if ( SUCCEEDED(hr) )
OO>        {
OO>            // Initialize the document.
OO>            hr = pPersistStreamInit->InitNew();
OO>            if ( SUCCEEDED(hr) )
OO>            {
OO>                // Load the contents of the stream.
OO>                hr = pPersistStreamInit->Load( pStream );
OO>            }
OO>            pPersistStreamInit->Release();
OO>        }
OO>    }
OO>}
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Загрузить IHTMLDocument2 из IStream
От: OlegO Россия http://www.mediachase.ru
Дата: 25.01.02 09:01
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Здравствуйте OlegO, Вы писали:


VD>Плиз, добавляй форматирование тегом "ccode"!


Хорошо
я до этого всегда код вставлял, а тут видимо забыл
Можно сказать первый раз не поставил
С уважением, OlegO.
Re[3]: Загрузить IHTMLDocument2 из IStream
От: leshka  
Дата: 25.01.02 15:02
Оценка:
Здравствуйте OlegO, Вы писали:

OO>// Собственно вот и сама функция, что-то с первого раза поленился послать :)


OO>HRESULT LoadWebBrowserFromStream(IWebBrowser* pWebBrowser, IStream* pStream)

OO>{
OO>HRESULT hr;
OO>IDispatch* pHtmlDoc = NULL;
OO>IPersistStreamInit* pPersistStreamInit = NULL;

OO> // Retrieve the document object.

OO> hr = pWebBrowser->get_Document( &pHtmlDoc );
OO> if ( SUCCEEDED(hr) )
OO> {
OO> // Query for IPersistStreamInit.
OO> hr = pHtmlDoc->QueryInterface( IID_IPersistStreamInit, (void**)&pPersistStreamInit );
OO> if ( SUCCEEDED(hr) )
OO> {
OO> // Initialize the document.
OO> hr = pPersistStreamInit->InitNew();
OO> if ( SUCCEEDED(hr) )
OO> {
OO> // Load the contents of the stream.
OO> hr = pPersistStreamInit->Load( pStream );
OO> }
OO> pPersistStreamInit->Release();
OO> }
OO> }
OO>}

Спасибо, я так пробовал, но почему-то не проходит.
Подозреваю, что проблема из-за IStream. Он вообще char-овский, пробовал также OLECHAR-овский, все равно не проходит.
Re[4]: Загрузить IHTMLDocument2 из IStream
От: OlegO Россия http://www.mediachase.ru
Дата: 26.01.02 07:17
Оценка:
L>Спасибо, я так пробовал, но почему-то не проходит.
L>Подозреваю, что проблема из-за IStream. Он вообще char-овский, пробовал также OLECHAR-овский, все равно не проходит.

Вот рабочий код создания IStream:


    HGLOBAL hMem = GlobalAlloc(GMEM_ZEROINIT,(m_strHTML.GetLength()+1)*sizeof(TCHAR));
    LPVOID pData = GlobalLock(hMem);
    CopyMemory(pData,(LPVOID)((LPCTSTR)m_strHTML),(m_strHTML.GetLength()+1)*sizeof(TCHAR));
    GlobalUnlock(hMem);
    
    IStream*    dataStream;
    CreateStreamOnHGlobal(hMem,TRUE,&dataStream);
    ...


PS: посмотри статью что я указывал выше, там есть рабочий пример.
С уважением, OlegO.
Re[5]: Загрузить IHTMLDocument2 из IStream
От: Аноним  
Дата: 28.01.02 15:27
Оценка:
Здравствуйте OlegO, Вы писали:

L>>Спасибо, я так пробовал, но почему-то не проходит.

L>>Подозреваю, что проблема из-за IStream. Он вообще char-овский, пробовал также OLECHAR-овский, все равно не проходит.

OO>Вот рабочий код создания IStream:



OO>
OO>    HGLOBAL hMem = GlobalAlloc(GMEM_ZEROINIT,(m_strHTML.GetLength()+1)*sizeof(TCHAR));
OO>    LPVOID pData = GlobalLock(hMem);
OO>    CopyMemory(pData,(LPVOID)((LPCTSTR)m_strHTML),(m_strHTML.GetLength()+1)*sizeof(TCHAR));
OO>    GlobalUnlock(hMem);
OO>    
OO>    IStream*    dataStream;
OO>    CreateStreamOnHGlobal(hMem,TRUE,&dataStream);
OO>    ...
OO>


OO>PS: посмотри статью что я указывал выше, там есть рабочий пример.


Да, я так тоже пробовал, но не получалось. Только сейчас я наконец вспомнил про асинхронность, метод Load из IPersistStreamInit грузит асинхронно, а я почему-то про это и не подумал сразу. Но теперь все заработало, спасибо. :))
Re[4]: Загрузить IHTMLDocument2 из IStream
От: svld  
Дата: 25.04.02 13:21
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Здравствуйте OlegO


Все хорошо. И это все работает, усли в броузере сидит HTML документ. Если же там открыт Word, то мы мило уходим ничего не сделав. Ну нет в Word-е IPersistStreamInit.
А посему вопрос. Как из контрола выгрузить Word и вернуть HTML документ?

VD>
OO>>HRESULT LoadWebBrowserFromStream(IWebBrowser* pWebBrowser, IStream* pStream)
OO>>{
OO>>HRESULT hr;
OO>>IDispatch* pHtmlDoc = NULL;
OO>>IPersistStreamInit* pPersistStreamInit = NULL;

OO>>    // Retrieve the document object.
OO>>    hr = pWebBrowser->get_Document( &pHtmlDoc );
OO>>    if ( SUCCEEDED(hr) )
OO>>    {
OO>>        // Query for IPersistStreamInit.
OO>>        hr = pHtmlDoc->QueryInterface( IID_IPersistStreamInit,  (void**)&pPersistStreamInit );
OO>>        if ( SUCCEEDED(hr) )
OO>>        {
OO>>            // Initialize the document.
OO>>            hr = pPersistStreamInit->InitNew();
OO>>            if ( SUCCEEDED(hr) )
OO>>            {
OO>>                // Load the contents of the stream.
OO>>                hr = pPersistStreamInit->Load( pStream );
OO>>            }
OO>>            pPersistStreamInit->Release();
OO>>        }
OO>>    }
OO>>}
VD>
Re[5]: Загрузить IHTMLDocument2 из IStream
От: OlegO Россия http://www.mediachase.ru
Дата: 25.04.02 13:35
Оценка: 4 (1)
Здравствуйте svld, Вы писали:

S>Все хорошо. И это все работает, усли в броузере сидит HTML документ. Если же там открыт Word, то мы мило уходим ничего не сделав. Ну нет в Word-е IPersistStreamInit.

S>А посему вопрос. Как из контрола выгрузить Word и вернуть HTML документ?


Сначала сделать Navigate на "about:blank" и продолжить работу см.Выше.
С уважением, OlegO.
Re[3]: Загрузить IHTMLDocument2 из IStream
От: Vi2 Удмуртия http://www.adem.ru
Дата: 25.04.02 14:02
Оценка:
Здравствуйте OlegO, Вы писали:

OO>// Собственно вот и сама функция, что-то с первого раза поленился послать


OO>HRESULT LoadWebBrowserFromStream(IWebBrowser* pWebBrowser, IStream* pStream)
OO>{
OO>HRESULT hr;
OO>IDispatch* pHtmlDoc = NULL;
OO>IPersistStreamInit* pPersistStreamInit = NULL;

OO>    // Retrieve the document object.
OO>    hr = pWebBrowser->get_Document( &pHtmlDoc );
OO>    if ( SUCCEEDED(hr) )
OO>    {
OO>        // Query for IPersistStreamInit.
OO>        hr = pHtmlDoc->QueryInterface( IID_IPersistStreamInit,  (void**)&pPersistStreamInit );
OO>        if ( SUCCEEDED(hr) )
OO>        {
OO>            // Initialize the document.
OO>            hr = pPersistStreamInit->InitNew();
OO>            if ( SUCCEEDED(hr) )
OO>            {
OO>                // Load the contents of the stream.
OO>                hr = pPersistStreamInit->Load( pStream );
OO>            }
OO>            pPersistStreamInit->Release();
OO>        }
OO>    }
OO>}

Как это (выделенные строчки) согласуется с MSDN?
Platform SDK: COM 
IPersistStreamInit::Load
...
Remarks 
If the object has already been initialized with InitNew, then this method must return E_UNEXPECTED
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: Ссылки на MSDN
От: Vi2 Удмуртия http://www.adem.ru
Дата: 25.04.02 14:09
Оценка:
Vi2>Как это (выделенные строчки) согласуется с MSDN?
Vi2>
Vi2>Platform SDK: COM 
Vi2>IPersistStreamInit::Load
Vi2>...
Vi2>Remarks 
Vi2>If the object has already been initialized with InitNew, then this method must return E_UNEXPECTED
Vi2>

Чтобы не буть голословным
Для InitNew
Для Load
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[5]: Ссылки на MSDN
От: OlegO Россия http://www.mediachase.ru
Дата: 25.04.02 14:24
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>>Как это (выделенные строчки) согласуется с MSDN?

Vi2>>
Vi2>>Platform SDK: COM 
Vi2>>IPersistStreamInit::Load
Vi2>>...
Vi2>>Remarks 
Vi2>>If the object has already been initialized with InitNew, then this method must return E_UNEXPECTED
Vi2>>

Vi2>Чтобы не буть голословным
Vi2>Для InitNew
Vi2>Для Load

Видимо никак, так эта функция тоже из MSDN:

Loading HTML content from a Stream

Причем этот код успешно работает, так что видимо Ремарка не права, хотя может пока
С уважением, OlegO.
Re[6]: Хозяин - барин
От: Vi2 Удмуртия http://www.adem.ru
Дата: 25.04.02 14:31
Оценка:
Здравствуйте OlegO, Вы писали:

OO>Видимо никак, так эта функция тоже из MSDN:

OO>Loading HTML content from a Stream
OO>Причем этот код успешно работает, так что видимо Ремарка не права, хотя может пока

Что ж хозяин — барин, это я к Мелкософту.
Цитата оттуда (Loading HTML content from a Stream)

MS>Note In Microsoft Internet Explorer 5, more than one call to the Load method of the IPersist interfaces is supported. In earlier versions, only one call to Load per instance of MSHTML is supported.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[7]: Хозяин - барин
От: OlegO Россия http://www.mediachase.ru
Дата: 25.04.02 14:37
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>Здравствуйте OlegO, Вы писали:


OO>>Видимо никак, так эта функция тоже из MSDN:

OO>>Loading HTML content from a Stream
OO>>Причем этот код успешно работает, так что видимо Ремарка не права, хотя может пока

Vi2>Что ж хозяин — барин, это я к Мелкософту.

Vi2>Цитата оттуда (Loading HTML content from a Stream)

Да
С уважением, OlegO.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.