Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: CHtmlView - Вывод буфера, а не файла  (Прочитано 24271 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« : 07-04-2004 09:06 » 

Сосбтвенно - найти пока не смог - есть советы создавать собственный ISAPI но шизеть не охота - наверняка есть возможности загружать не файлы и линки - а обычный свой буфер!!!!
Записан

А птичку нашу прошу не обижать!!!
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 07-04-2004 19:38 » 

А что никто не знает???
Записан

А птичку нашу прошу не обижать!!!
Serega
Гость
« Ответ #2 : 07-04-2004 19:39 » 

Файл это тот же буфер, только на винте
Записан
Chaa
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 08-04-2004 03:51 » 

В MSDN есть статья Loading HTML content from a Stream. Общая идея:
1. Navigating to about:blank
2. Using QueryInterface to Obtain the IPersistStreamInit Interface
3. Using the IPersistStreamInit Interface to Load HTML Content

Код:
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();
        }
    }
}
« Последнее редактирование: 25-11-2007 16:28 от Алексей1153++ » Записан
Chaa
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 08-04-2004 03:53 » 

Ссылка на локальный MSDN:
ms-help://MS.VSCC/MS.MSDNVS/ProgIE/workshop/browser/webbrowser/tutorials/WebOCStream.htm
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #5 : 08-04-2004 05:38 » 

Serega, нет в том то и дело!
Физически - данные не меняются - это и пнб понятно - виртуальный  файл - знакомо мне это - проблема в другом!!!
Нет у View объекта - метода загрузки динамического  буфера! А есть загрузка с ссылки на Web или с файла по имени!

Т.е. нельзя взять данные из БД - которые сам понимаешь не просто файл - потом засунуть их в буфер - положить сверху форматирующую обертку из HTML кода и вывести этот динамический буфер без записи в файл на экран - например как в MSDN!
Вот Chaa вроде подсказал похожее - буду пробовать днем - отпишу что и как!


Chaa, спасибо - в этой области винды я не очень работал - только со стандартными объектами типа CTreeView!
Записан

А птичку нашу прошу не обижать!!!
SOS
Гость
« Ответ #6 : 19-04-2004 14:45 » 

Гром

У меня были подобные проблемы.
Решил их использованием DHTML Edit Control от Microsoft. Это тот, что во FrontPage стоит.
Project->Add to Project->Registered ActivX Controls

У него, так же намного больше возможностей, чем у CHtmlView
Записан
kisilevski
Постоялец

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 27-04-2004 08:21 » 

Может быть и поздно пишу, но  всё-таки:
Задачка динамического формирования контента CHTMLView и CDHTMLDialog решается следующим образом:

1. Создаём файл-заготовку HTML, в которой назначаем ID для тэга, который хотим заменить на <содержимое буфера>, например:

Код:
<HTML>
 <BODY>
  <p id="idContent">Content</p>
 </BODY>
</HTML>

пихаем его в ресурс и загружаем его как Initial content для IE, встроенного в диалог или вид.

2. В нужный нам момент времени (например, юзер что-то нажал, или диалог загрузился, или View обновился) получаем указатель на тэг по его ID:

Код:
// Пример для диалога
void CDlg_Node::OnDocumentComplete(LPDISPATCH pDisp, LPCTSTR szUrl)
{
 CDHtmlDialog::OnDocumentComplete(pDisp, szUrl);  // это надо вызывать
 
CComPtr<IHTMLElement> pHE_Cnt=NULL;
 GetElementInterface(_T("idContent"), IID_IHTMLElement, (void **) &pHE_Cnt);
 if(!pHE_Cnt) return;

 BSTR bstrHE = NULL; // Эту строку потом закинем

 CString Str; // Сформируем новую строчку:
 Str = "<p id=\"idContent\">Новый текст параграфа</p>";
 bstrHE = Str.AllocSysString();

 pHE_Cnt->put_outerHTML(bstrHE);  // Собственно закидывание нового контента
 SysFreeString(bstrHE);   // Смоем за собой

}

Пример для View несколько более громоздкий, но там это тоже возможно.
вот и всё. Ежели надо - пример кину почтой.
« Последнее редактирование: 25-11-2007 16:30 от Алексей1153++ » Записан

Ложки нет. See MSDN for details.
mixa
Гость
« Ответ #8 : 30-04-2004 15:54 » 

Вот же бля%%кая система. Что у них руки поотсыхали сделать по нормальному Не понял? Насколько бы легче можно было бы морды делать !!!! Загнал HTML и порядок.

Хотя, хотя если можно закинуть в HTML любой тег через put_outerHTML, это уже что-то  Отлично
Записан
dachny
Гость
« Ответ #9 : 04-03-2005 10:55 » 

Да че вы гоните дети
а ето

Navigate2(
   LPCTSTR lpszURL,
   DWORD dwFlags,
   CByteArray& baPostedData,
   LPCTSTR lpszTargetFrameName = NULL,
   LPCTSTR lpszHeader = NULL
);


а ето

void Navigate(
   LPCTSTR URL,
   DWORD dwFlags = 0,
   LPCTSTR lpszTargetFrameName = NULL,
   LPCTSTR lpszHeaders = NULL,
   LPVOID lpvPostData = NULL,
   DWORD dwPostDataLen = 0
);
Parameters

Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #10 : 04-03-2005 11:21 » 

Саше Дачному.
Последнее предупреждение от детей.
Еще одно сообщение в таком тоне, будешь рассказывать о своей крутости на RSDN.

По поводу фунции Navigate - вопрос к взрослому - укажи какой параметр принимает не имена файла или URL на удаленном сервере, а обычный текстовый буфер...

Скажем в вышеуцпомянутой задачи HTML  страница формируется ODBC запросом данных из Акцесса, а потом данные ззаворачиваются программно в HTML и файла не существует и URL тоже - только блок данных в памяти - в какой параметр функции Navigate или Navigate2 вставить указатель на этот буфер...


П.С. Заранее зная что такой возможности у этой функции нет, предлагаю тебе Умник, придумать такую реализацию для классa CHTMLView...

Реализацию с помощью других классов не предлагать.
Записан

А птичку нашу прошу не обижать!!!
Anchorite
Гость
« Ответ #11 : 05-03-2005 14:45 » 

Это просто мысль, но нельзя воспользоваться отображаемыми в память файлами?
Записан
daxhny
Гость
« Ответ #12 : 07-03-2005 07:39 » 

2Гром
Я Не прав , Я это понял еще когда давил кнопку пост
А мысль про мапфайл вполне здравая она мне тоже в голову приходила пока сгорая от стыда я думал какова реация на мой хамский пост

Форум RSDN я не люблю ваш круче



Записан
Serega
Гость
« Ответ #13 : 07-03-2005 08:17 » 

а MSDN все же рулит  Отлично

LPDISPATCH CHtmlView::GetHtmlDocument();

с помощью QueryInterface получаем:
IHTMLDocument - работа со скриптовым движком
IHTMLDocument2 - работа с докуметом
IHTMLDocument3 - создание фрагментов/документов и феньки вроде поиска и дополнительных обработчиков событий

нас интересует IHTMLDocument2, создаем его с помощью IHTMLDocument3::createDocumentFragment

далее нам нужно получить элемент body:
HRESULT IHTMLDocument2::get_body(IHTMLElement **p);

у этого элемента есть много полезных для нас функций:
HRESULT IHTMLElement::put_innerHTML(BSTR v);
HRESULT IHTMLElement::put_innerText(BSTR v);
HRESULT IHTMLElement::insertAdjacentHTML(BSTR where, BSTR html);
HRESULT IHTMLElement::insertAdjacentText(BSTR where, BSTR text);

работа не столь сложная на первый взгляд, как это работает на практике не знаю =)
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #14 : 07-03-2005 09:08 » 

Anchorite Параметром у функций Navigate принимается URL типа file:// на диске, или http:// обычный в интернете.
Мапированные файлы в память такого типа пути не имеют насколько я помню.
Серега, похоже ты попал в точку, но все это надо проверить. Но самое главное, методы с которыми ты предлагаешь повозиться не являются напрямую методами класса CHTMLView - это уже обращение к объекту который за ним...
Записан

А птичку нашу прошу не обижать!!!
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #15 : 07-03-2005 09:09 » 

daxhny, ответил в письме - извинения приняты - санкций не будет Улыбаюсь
Привет тебе на нашем форуме.
Записан

А птичку нашу прошу не обижать!!!
Serega
Гость
« Ответ #16 : 07-03-2005 18:34 » 

Серега, похоже ты попал в точку, но все это надо проверить. Но самое главное, методы с которыми ты предлагаешь повозиться не являются напрямую методами класса CHTMLView - это уже обращение к объекту который за ним...
Гром ты что-то видимо не так понимаешь, CHTMLView ничего сам не делает, это просто адаптер для COM обьекта InternetExplorer
если посмотреть код, то там будет указатель IWebBrowser2
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #17 : 07-03-2005 19:02 » 

Серег - как раз я правильно понял Улыбаюсь Я знаю что весь MFC сам ничего не делает.
Все классы это всего лишь прослойка между API и пользователем, между Interface и пользователем и т.д.

Но я когда работаю с простыми классами не заморачиваюсь с работой с интерфейсом, а если я переключаюсь на интерфейсы, так на фиг мне частично использовать прослойку CHTMLView Не понял
Записан

А птичку нашу прошу не обижать!!!
Anchorite
Гость
« Ответ #18 : 08-03-2005 07:45 » 

Гром, а скажи пжлста, нальзя ли воспользоваться файлам при создании которых выставлены флаги FILE_ATTRIBUTE_TEMPORARY и FILE_FLAG_DELETE_ON_CLOSE?
Файл создашь во временной папке. При закрытии он грохнется. А т.к. стоит FILE_ATTRIBUTE_TEMPORARY то система попытается не запысывать его содержимое на диск без необходимости.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #19 : 08-03-2005 07:49 » 

Anchorite - можно кончено.
Но
1. Мне не нужно его открывать и закрывать. Я его должен сформировать и закрыть потом сделать на него Navigate. Стирать можно только по окончании работы с программой - т.е. делать не один а кучу темп файлов - и следить повторяется ли запрос к БД или нет - морока.
2. Работа с HDD всегда медленне чем с памятью, да и для харда постоянное открытие и закрытие файлов - это моветон с стороны программера. Когда без этого не обойтись то другое дело, а вот когда так криво писать - просто нет желания.
3. Есть возможность сделать это более сложно через .NET технологию - просто времеени нету, да и задачка отменилась, счас просматриваю RSS возможность подключения к сайту. Как сделаею - будеит возможность следить за сайтом не заходя на него все время...
Записан

А птичку нашу прошу не обижать!!!
Serega
Гость
« Ответ #20 : 08-03-2005 08:31 » 

Но я когда работаю с простыми классами не заморачиваюсь с работой с интерфейсом, а если я переключаюсь на интерфейсы, так на фиг мне частично использовать прослойку CHTMLView Не понял
Без CHTMLView тебе будет сложно(очень Ага) раз уж ты завязался на MFC
А кто говорил о мороке с интерфейсами ? Главная заморочка - MFC Отлично
Не помню как это делается, но надо импортить IDL описание эксплореровское чтобы VS тебе создала обертки MFC-шные

Есть возможность сделать это более сложно через .NET технологию - просто времеени нету, да и задачка отменилась, счас просматриваю RSS возможность подключения к сайту. Как сделаею - будеит возможность следить за сайтом не заходя на него все время...
А причем тут это ? или это не имеет отношения к MFC ?

Вариант: не изобретать велосипед а воспользоваться хорошей CMS
у меня сайт на мамбе работает, забирать инфу можно в RSS, Atom и OPML
также сообществом создано много модулей для интегриции форумов, галерей, библиотек, факов, файловых архивов и т.д.
Это наверно оффтоп, можно удалить если не интересно
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #21 : 08-03-2005 08:59 » 

Serega - ты клевещешь. Наш сайт работает на нашем же движке.
Сейчас стоит задача - обеспечить экспорт всего что надо - через RSS.
Раньше думал сделать офлайн базу, теперь тут: http://faq.shelek.com такая программка уже есть - остается написать конвертер для нас самих и офлайн сайт готов - можно выпускать...
Записан

А птичку нашу прошу не обижать!!!
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #22 : 08-03-2005 09:00 » 

Что касается MFC и Interface второе много сложнее - первое не менее кривое.
ИМХО разумеется.
Кроме того - из классики,  тебе всегда легко то, что ты уже умеешь и тяжело новое.
Есть в этом супер истина.
Я знаю MFC - очень неплохо, а с интерфейсами возился мало - все задач не было.
Вот поэтому пыталс так.
Собственно тема потеряла актуальность давненько - просто раз поднялась - рассказываю..
Записан

А птичку нашу прошу не обижать!!!
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines