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

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

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

WWW
« : 02-12-2008 14:57 » 

Коллеги, помогите, пожалуйста. Появилась проблема с сохранением страницы из IWebBrowser2. Я пробовал это делать двумя способами, но ни один не отработал как надо.
Дело в том, что сохраненная страница работает неправильно. Например, если сохранить гугловую страницу, то кнопка поиска, вместо генерации длинного гет запроса, будет просто редиректить на локалхост. Т.е. весь функционал кнопки пропадает олностью.

Отсюда, вопрос. Можно ли каким-то образом сделать нормальное сохранение страницы? Чтобы результат сохранения был такой же, как и при сохранении через меню эксплорера (Файл->Сохранить как), но напрямую, без соответствующего диалога.

Два метода, которые я использую для сохранения страницы:

Код:
  IDispatch* iDisp;
  IHTMLDocument2* Html;
  IPersistFile* PFile;
  wchar_t wsFileName[MAX_PATH] = {0};
  MultiByteToWideChar(CP_ACP, 0, szFileName, strlen(szFileName), wsFileName, MAX_PATH);

  WebBrowser->get_Document(&iDisp);

  iDisp->QueryInterface(IID_IHTMLDocument2, (void**)&Html);

// HtmlSaveText(Html);

  Html->QueryInterface(IID_IPersistFile, (void**)&PFile);

  PFile->Save(wsFileName, true);

  PFile->Release();

  Html->Release();
  iDisp->Release();

Код:
void HtmlSaveText( IHTMLDocument2* pDoc)
{
    USES_CONVERSION;
    char szFileName[MAX_PATH] = {0};

    CComQIPtr< IHTMLElementCollection, &IID_IHTMLElementCollection> pAll;
    pDoc->get_all( &pAll );

    CComBSTR bsAll;
    CComVariant v1( 0), v2;   
    CComQIPtr<IDispatch, &IID_IDispatch> pDisp;   
    pAll->item( v1, v2, &pDisp);

    CComQIPtr<IHTMLElement, &IID_IHTMLElement> pElement;
    pElement = pDisp;
    pElement->get_outerHTML( &bsAll);

unsigned long dwWritten = 0;

char* pBuffer = (char*)malloc(bsAll.Length());
memset(pBuffer, 0, bsAll.Length());

WideCharToMultiByte(CP_ACP, 0, bsAll, -1, pBuffer, bsAll.Length(), NULL, NULL);

HANDLE hFile = CreateFile("D:\\Site.html", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);

WriteFile(hFile, pBuffer, bsAll.Length(), &dwWritten, NULL);

CloseHandle(hFile);

free(pBuffer);

Ни один, ни другой метод не дают желаемого результата.
Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
BlackStar
Постоялец

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

WWW
« Ответ #1 : 05-12-2008 14:25 » 

Выяснилось, что если сохраненный файл открывать эксплорером с диска вручную, то кнопка работает нормально. Но если загружать его с помощью Navigate2(), как я это делаю, то в строку навигации попадает "C:\Search\" без всякого запроса.

То есть, не просто редиректит на локалхост, что было бы вполне нормальным явлением, а вобще непойми что происходит!

Я открываю файл следующим образом:

WebBrowser->Navigate2(&CComVariant(szFileName),
                &CComVariant(0),
                &CComVariant(),
                &CComVariant(),
                &CComVariant());

Может флаг какой нужен?..
Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
zubr
Гость
« Ответ #2 : 05-12-2008 15:31 » 

Перед путем к файлу file:/// и слеши обратные
Записан
Джон
просто
Администратор

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

« Ответ #3 : 05-12-2008 16:39 » 

zubr, это как раз нормальные слэши. Ага Обратные, это которые наоборот -> \
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #4 : 05-12-2008 16:52 » 

Джон,  обратные по отношению к C:\Search\
Записан
Джон
просто
Администратор

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

« Ответ #5 : 05-12-2008 16:59 » 

zubr, так вот эти и называются - backslash, те обратный слэш. / - это нормальный слэш. Ага

\ - back slash

/ - slash
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
BlackStar
Постоялец

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

WWW
« Ответ #6 : 05-12-2008 17:13 » 

Что-то я не совсем понял сколько слэшей и куда вставлять...
Вы не могли бы продемонстрировать адресную строку для файла, скажем, C:\Site.html ?
Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
zubr
Гость
« Ответ #7 : 05-12-2008 17:33 » 

file:///C:/Site.html
Записан
BlackStar
Постоялец

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

WWW
« Ответ #8 : 05-12-2008 19:15 » 

Спасибо.

Но, к сожаленью, это не помогло Жаль
Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
RXL
Технический
Администратор

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

WWW
« Ответ #9 : 05-12-2008 19:15 » 

file:///C:/Site.html

Поясняю детальнее:
красным отмечен протокол (он всегда завершается двоеточием),
зеленым - разделитель (зависит от протокола - для единообразия и сходства с http и ftp для file выбран точно такой же разделитель),
синим - путь (причем от должен начинаться со слеша).

Кстати, этот вопрос (и также - в цветах) я уже расписывал в одной теме с год назад.
« Последнее редактирование: 05-12-2008 19:19 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
BlackStar
Постоялец

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

WWW
« Ответ #10 : 05-12-2008 19:20 » 

Видимо, эксплорер приводит урл такого вида к обычному дисковому файлу и в OnBeforeNavigate2 попадает снова то же самое - "C:\Site"  Ну, а дальше результат известен.
Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines