Re[3]: Microsoft Web Browser - вывод ХТМЛ из памяти ????
От: mik1  
Дата: 08.09.03 09:08
Оценка:
Здравствуйте, Saddam, Вы писали:

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


А>>>Собственно вопрос: как вывести ХТМЛ, который лежит не в файле, а в памяти. В файл сохранять нельзя, а из памяти Navigate не работает. Что делать?


M>>Иногда не мешает читать матчасть (MSDN Magazine, собственно — за август 2003).

M>>Вот где по этому поводу выссказывается классик:
M>>http://msdn.microsoft.com/msdnmag/issues/03/08/CQA/

S>Проблема в том, что Outlook-овские HTML-сообщения не отображаются таким образом. Получилось только через Memory Stream. Собственно, интерфейс для этого так и предназначен, я так понимаю. )


Странно, конечно, но да ладно. Запомним.
Сам я вообще в VB все это дело писал. Всего 4 строчки кода, если строка с html уже подготовлена
Re[2]: Microsoft Web Browser - вывод ХТМЛ из памяти ????
От: Аноним  
Дата: 08.09.03 10:44
Оценка:
Благодарю всех за ответы. Благодаря им я разобрался... почти. Осталась одна проблема — Windows 98!
В общем пишу я так:
void CHeritageDlg::OnDocumentComplete( IDispatch* pDisp, VARIANT* URL )
{
    HRESULT     hr;                         // Control variable
    IUnknown*   pUnkBrowser = NULL;         // Browser IUnknown
    IUnknown*   pUnkDisp    = NULL;         // Dispatch IUnknown
    IStream*    pStream     = NULL;         // Load Stream Interface
    HGLOBAL     hHTMLText;                  // Handle to Global HTML array

//    MessageBox( NULL, "OnDocumentComplete", "Started", MB_OK );
    if ( m_bBrowserLoad )
    {                                       // If we're allowed to load...
        m_bBrowserLoad = false;             // Do not load again!!!
        hr = m_pIWebBrowser->QueryInterface( IID_IUnknown,  
                                             (void**)&pUnkBrowser );
        if ( SUCCEEDED(hr) )
        {
            hr = pDisp->QueryInterface( IID_IUnknown,  (void**)&pUnkDisp );
            if ( SUCCEEDED(hr) )
            {
                if ( pUnkBrowser == pUnkDisp )
                {
                    hHTMLText = GlobalAlloc( GPTR, m_nHTMLSize + 2 );
                    if ( hHTMLText )
                    {
                        memcpy( hHTMLText, m_pOutputHTML, m_nHTMLSize + 1 );
                        hr = CreateStreamOnHGlobal( hHTMLText, FALSE, &pStream );
                        if ( SUCCEEDED(hr) )
                        {
                            LoadWebBrowserFromStream( m_pIWebBrowser, 
                                                      pStream  );
                            pStream->Release();
                        }
                    }
                }
                pUnkDisp->Release();
            }
            pUnkBrowser->Release();
        }
    }
//    MessageBox( NULL, "OnDocumentComplete", "Finished", MB_OK );
}

HRESULT CHeritageDlg::LoadWebBrowserFromStream( IWebBrowser* pWebBrowser, 
                                                IStream*     pStream )
{
    HRESULT             hr;
    IDispatch*          pHtmlDoc = NULL;
    IPersistStreamInit* pPersistStreamInit = NULL;
    hr = m_pIWebBrowser->get_Document( &pHtmlDoc );
    ATLASSERT(pStream);
    if ( SUCCEEDED(hr) )
    {
        hr = pHtmlDoc->QueryInterface( IID_IPersistStreamInit,  
                                       (void**)&pPersistStreamInit );
        if ( SUCCEEDED(hr) )
        {
            //hr = pPersistStreamInit->InitNew();
            if ( SUCCEEDED(hr) )
            {
                hr = pPersistStreamInit->Load( pStream );          !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
                if (hr)
                {
                    MessageBox( NULL, "Load(pStream) - FAILURE", "Load(pStream) - FAILURE", MB_OK );
                }
                else 
                    MessageBox( NULL, "Hi", "Load(pStream) - SUCCEEDED", MB_OK );
            }
            pPersistStreamInit->Release();
        }
    }

    return hr;
}

Под 2000-й и ХР все проходит. В 98-й винде у нас на тестовой машине стоит 4-й эксплорер. Но все проходит кроме строки с !!!!!!!!!!!!!!!!!!!!!!!!!!! Возвращает она E_UNEXPECTED. Причем, в 2000-й винде все работает даже если раскоментировать строку
hr = pPersistStreamInit->InitNew();
несмотря на то, что оно должно этот самый E_UNEXPECTED возвращать. В 98-й по любому ошибка
Кстати выше приведенный код взят с мелкософтового МСДН сайта.
Re[3]: Microsoft Web Browser - вывод ХТМЛ из памяти ????
От: Saddam Россия http://saddam.narod.ru
Дата: 08.09.03 11:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>[/code]

А>Под 2000-й и ХР все проходит. В 98-й винде у нас на тестовой машине стоит 4-й эксплорер. Но все проходит кроме строки с !!!!!!!!!!!!!!!!!!!!!!!!!!! Возвращает она E_UNEXPECTED. Причем, в 2000-й винде все работает даже если раскоментировать строку
А>hr = pPersistStreamInit->InitNew();
А>несмотря на то, что оно должно этот самый E_UNEXPECTED возвращать. В 98-й по любому ошибка
А>Кстати выше приведенный код взят с мелкософтового МСДН сайта.
В BCB надо передавать не указатель на поток, а поток. Может поможет?

hr = pPersistStreamInit->Load( *pStream );
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Re[4]: Microsoft Web Browser - вывод ХТМЛ из памяти ????
От: Аноним  
Дата: 08.09.03 11:56
Оценка:
Здравствуйте, Saddam, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


А>>[/code]

А>>Под 2000-й и ХР все проходит. В 98-й винде у нас на тестовой машине стоит 4-й эксплорер. Но все проходит кроме строки с !!!!!!!!!!!!!!!!!!!!!!!!!!! Возвращает она E_UNEXPECTED. Причем, в 2000-й винде все работает даже если раскоментировать строку
А>>hr = pPersistStreamInit->InitNew();
А>>несмотря на то, что оно должно этот самый E_UNEXPECTED возвращать. В 98-й по любому ошибка
А>>Кстати выше приведенный код взят с мелкософтового МСДН сайта.
S>В BCB надо передавать не указатель на поток, а поток. Может поможет?

S>
S>hr = pPersistStreamInit->Load( *pStream );          
S>

Нет, товарищ, ты что-то путаешь. Этот метод объявлен так
STDMETHOD(Load)( LPSTREAM pStm );

А если написать так как ты написал, то компилятор пишет

error C2664: 'IPersistStreamInit::Load' : cannot convert parameter 1 from 'IStream' to 'LPSTREAM'
Re[5]: Microsoft Web Browser - вывод ХТМЛ из памяти ????
От: Saddam Россия http://saddam.narod.ru
Дата: 08.09.03 13:16
Оценка:
Здравствуйте, Аноним, Вы писали:

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


S>>Здравствуйте, Аноним, Вы писали:


А>>>[/code]

А>>>Под 2000-й и ХР все проходит. В 98-й винде у нас на тестовой машине стоит 4-й эксплорер. Но все проходит кроме строки с !!!!!!!!!!!!!!!!!!!!!!!!!!! Возвращает она E_UNEXPECTED. Причем, в 2000-й винде все работает даже если раскоментировать строку
А>>>hr = pPersistStreamInit->InitNew();
А>>>несмотря на то, что оно должно этот самый E_UNEXPECTED возвращать. В 98-й по любому ошибка
А>>>Кстати выше приведенный код взят с мелкософтового МСДН сайта.
S>>В BCB надо передавать не указатель на поток, а поток. Может поможет?

S>>
S>>hr = pPersistStreamInit->Load( *pStream );          
S>>

А>Нет, товарищ, ты что-то путаешь. Этот метод объявлен так
А>
А>STDMETHOD(Load)( LPSTREAM pStm );
А>

А>А если написать так как ты написал, то компилятор пишет

А>error C2664: 'IPersistStreamInit::Load' : cannot convert parameter 1 from 'IStream' to 'LPSTREAM'

Значит враперы в VC и BCB реализованы по-разному
Попробуй на 98-ю поставить 5-й эксплорер.
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Re[6]: Microsoft Web Browser - вывод ХТМЛ из памяти ????
От: Аноним  
Дата: 08.09.03 13:27
Оценка:
А>>error C2664: 'IPersistStreamInit::Load' : cannot convert parameter 1 from 'IStream' to 'LPSTREAM'
S>Значит враперы в VC и BCB реализованы по-разному
S>Попробуй на 98-ю поставить 5-й эксплорер.

Я думаю 6-й сразу ставить. Ты мне скажи, его можно поставить так, чтобы юзер не видел сам процесс установки?
Re[7]: Microsoft Web Browser - вывод ХТМЛ из памяти ????
От: Saddam Россия http://saddam.narod.ru
Дата: 08.09.03 14:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>error C2664: 'IPersistStreamInit::Load' : cannot convert parameter 1 from 'IStream' to 'LPSTREAM'

S>>Значит враперы в VC и BCB реализованы по-разному
S>>Попробуй на 98-ю поставить 5-й эксплорер.

А>Я думаю 6-й сразу ставить. Ты мне скажи, его можно поставить так, чтобы юзер не видел сам процесс установки?

Попытаться интегрировать в инсталяху 98
В твою инсталяху — попытаться каким-нить тракером отследить, что ставит MSIE.
А вообще — обычно таки вещи пишутся в требованиях. Типа, нуна для моей софтины тока 98-я с 6-м експлорером, и хоть ты тресни!
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Re: Microsoft Web Browser - вывод ХТМЛ из памяти ????
От: eugene32  
Дата: 08.09.03 15:15
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Собственно вопрос: как вывести ХТМЛ, который лежит не в файле, а в памяти. В файл сохранять нельзя, а из памяти Navigate не работает. Что делать?


... Я тут читал все нитки по теме и, понял, что полемика по оной ушла далеко от ответа. Суть проблемы не столь уж сложна. У меня тоже была такая проблема и, я накрапал кое какой тестовый код.

/VC-6, ProjectType — Simple Dialog/

m_WB is CWebBrowser2 control




void Dia::SomeMethod()
{
// TODO: Add your control notification handler code here
   
   CComPtr<IDispatch> di= m_WB.GetDocument();
   CComPtr<IHTMLDocument2> doc2;
   if(di) di->QueryInterface( __uuidof(IHTMLDocument2),(void**)&doc2 );
   if(doc2)
   {
      CComPtr<IPersistStreamInit> str_init;
      doc2->QueryInterface(__uuidof(IPersistStreamInit),(void**)&str_init);
      if(str_init)
      {
         str_init->InitNew();
         const char* s = "<html><body>ONE: <INPUT ></body></html>";
         char* x = (char*)::GlobalAlloc(GPTR,strlen(s)+1);
         if(x)
         {
            *x=(char)0;
            strcat(x,s);

            CComPtr<IStream> stm;
            ::CreateStreamOnHGlobal((HGLOBAL)x,TRUE,&stm);
            if(!stm)
               ::GlobalFree((HGLOBAL)x);
            else
               str_init->Load(stm);
         }
      }
      
   }
}


Ну естественнов OnInitDialog() нужно вставить строки

CComVariant V("about:blank");
m_WB.Navigate2( &V, NULL, NULL, NULL, NULL );
Re[2]: Microsoft Web Browser - вывод ХТМЛ из памяти ????
От: Saddam Россия http://saddam.narod.ru
Дата: 08.09.03 17:19
Оценка:
Здравствуйте, eugene32, Вы писали:

E>... Я тут читал все нитки по теме и, понял, что полемика по оной ушла далеко от ответа. Суть проблемы не столь уж сложна. У меня тоже была такая проблема и, я накрапал кое какой тестовый код.


Аналогичный код работает
Автор: eugene32
Дата: 08.09.03
на BCB.
Лениво было пробовать на VC.
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Re[3]: Microsoft Web Browser - вывод ХТМЛ из памяти ????
От: Аноним  
Дата: 09.09.03 06:59
Оценка:
Здравствуйте, Saddam, Вы писали:

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


E>>... Я тут читал все нитки по теме и, понял, что полемика по оной ушла далеко от ответа. Суть проблемы не столь уж сложна. У меня тоже была такая проблема и, я накрапал кое какой тестовый код.

S>
S>Аналогичный код работает
Автор: eugene32
Дата: 08.09.03
на BCB.

S>Лениво было пробовать на VC.
Да оно у меня уже давно работает под 2000-й виндой. Зато по 98-й на 4-м эксплорере нет! И хоть ты тресни
Под виндовс-линолиум с 5-м эксплорером тож работает. В общем чую я попал, прийдется либо убеждать начальство тягать эксплорер за собой либо переколбасивать весь проект
Re[4]: Microsoft Web Browser - вывод ХТМЛ из памяти ????
От: Saddam Россия http://saddam.narod.ru
Дата: 09.09.03 08:31
Оценка:
Здравствуйте, Аноним, Вы писали:

E>>>... Я тут читал все нитки по теме и, понял, что полемика по оной ушла далеко от ответа. Суть проблемы не столь уж сложна. У меня тоже была такая проблема и, я накрапал кое какой тестовый код.

S>>
S>>Аналогичный код работает
Автор: eugene32
Дата: 08.09.03
на BCB.

S>>Лениво было пробовать на VC.
А>Да оно у меня уже давно работает под 2000-й виндой. Зато по 98-й на 4-м эксплорере нет! И хоть ты тресни
А>Под виндовс-линолиум с 5-м эксплорером тож работает. В общем чую я попал, прийдется либо убеждать начальство тягать эксплорер за собой либо переколбасивать весь проект
Сдается мне, что в MSIE 4 такого интерфейса нет . Так, что тут ничего не попишешь.
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.