Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Ура! Найден способ...


Автор: mr.DUDA 1.2.2004, 17:15
Вот, нашёл способ и спешу поделиться со всеми, как достать HTML-исходник открытой веб-страницы и вообще заставить IE делать что угодно - вплоть до написания Anti-Popup приложения thumbs-up.gif .

Step
, RAN, neutrino, как вы думаете - стоит добавлять тему в FAQ или нет ?..

Всё что нужно - это:
1) добавить в начало программы CoInitialize(0); или AfxOleInit();
2) в исходнике, там где нужно получить текст из окна IE, написать:
Цитата

// самое начало файла
#pragma warning(disable : 4192)
#pragma warning(disable : 4146)
#import <mshtml.tlb> // Internet Explorer 5
#import <shdocvw.dll>

// ...........


// функция получает HWND, URL и HTML-текст из всех окон IE в системе
// результат - строка с собранной инфой
CString  InternetExplorerHook()
{
     CString strResult, strTemp;

     // получаем интерфейс IShellWindowsPtr
     SHDocVw::IShellWindowsPtr m_spSHWinds;
     if(m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) != S_OK)
     {
          AfxMessageBox("Shell Windows interface is not avilable");
               return "Error !";
     }

     // идём по списку окон IE в системе
     IDispatchPtr spDisp;
     long nCount = m_spSHWinds->GetCount();
     for (long i = 0; i < nCount; i++)
     {
          _variant_t va(i, VT_I4);
          spDisp = m_spSHWinds->Item(va);

          SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
          if(spBrowser != NULL)
          {
               // тут начинается самое интересное
               long hWnd; spBrowser->get_HWND(&hWnd);
               BSTR strURL; spBrowser->get_LocationURL(&strURL);

               strTemp.Format("\r\nFound a new IE window (HWND = %x)\r\nURL = %s",
                                             hWnd, CString(strURL));
               strResult += strTemp;

               IDispatchPtr spDisp;
               if(spBrowser->get_Document(&spDisp) == S_OK && spDisp!= 0)
               {
                    MSHTML::IHTMLDocument2Ptr spHtmlDocument(spDisp);
                    MSHTML::IHTMLElementPtr spHtmlElement;
                    spHtmlDocument->get_body(&spHtmlElement);
                    if(spHtmlElement != 0)
                    {
                         BSTR bstr;
                         spHtmlElement->get_outerHTML(&bstr);
                         strResult += "\r\nHTML source of this page is:\r\n\r\n" +
                                             CString(bstr) + "\r\n\r\n\r\n";
                    }
               }
          }
     }

     // освобождаем IShellWindows
     m_spSHWinds.Release();

     return  strResult;
}

Автор: Stalk 1.2.2004, 17:31
Круто!!! biggrin.gif Где нашел? Поделись линком!:)

Автор: mr.DUDA 1.2.2004, 19:36
http://www.codeguru.com/ieprogram/enumIE.html

З.Ы. у меня глюкает под 98-й виндой на строке:
Цитата
spHtmlDocument->get_body(&spHtmlElement);

а в XP всё пучком...

Автор: <Spawn> 1.2.2004, 21:03
крута), тоже довно это интересовало меня.

Автор: Stalk 1.2.2004, 21:10
Cool!!! Even more than I needed!!! hehe.gif

Автор: RAN 2.2.2004, 08:03
А чего бы не добавить. Очень позновательно.

Автор: Step 2.2.2004, 10:26
mr.DUDA, добовлять полюбому, если бы ты еще и код сотворил который в ИЕ писать штмл будет, вообщебы круто было....

Автор: mr.DUDA 2.2.2004, 12:01
Цитата
если бы ты еще и код сотворил который в ИЕ писать штмл будет, вообщебы круто было....

пжалста...

добавляем после строки:
Цитата
  strResult += "\r\nHTML source of this page is:\r\n\r\n" +
      CString(bstr) + "\r\n\r\n\r\n";

следующее:
Код
  if(CString(strURL) == "about:blank")
  {
     CString csNewText = "<body><br><br><br><br><br><br><table width=60% height=30% align=center style=\"border: 3px double #c0c0c0; background-color: #f0f0f0; font-family: MS Sans Serif; font-weight: bolder; font-size: xx-small\"><tr><td width=100% height=100% align=center valign=center>Винград - самый рульный форум !!!</td></tr></table></body>";

     BSTR bstr = csNewText.AllocSysString();
     spHtmlElement->put_innerHTML(bstr);
  }

и функция InternetExplorerHook() заменит содержимое всех окон, где URL - about:blank, на табличку с указанием какой форум самый рульный !!!

Почему спрашиваю насчёт FAQ - потому что в 98-ой винде прога категорически работать отказывается (ругается я написал где), как и пример с www.codeguru.com... Остальные примеры с того же сайта -- ещё менее работоспособные и более глючные...

Народ, помогите найти баг, плиз butbut.gif !!!!!!!!!!

Автор: Step 2.2.2004, 12:08
mr.DUDA, отвечаю почему размещать, вставляй только допиши что работает под тото..... а если программер граматный то сможет подделать и под 98, и я уверен что в 98 просто интерфейс чуть другой, и get_body(&spHtmlElement); както отличается, я посмотрю на досуке

Автор: mr.DUDA 2.2.2004, 12:36
to all:
Проблема с Win98 снята !
Оказывается, просто при генерации исходников с пом. #import из WinXP, создаваемые 4 файла (mshtml.tlh/.tli и shdocvw.tlh/.tli), оставшись в директории "Debug", использовались потом и при генерации из Win98 (компилер просто не стал заменять их, считая что они сгенерированы из TLB/DLL, лежащих в Windows/System 98-ой винды, а на самом деле-то исходнички были просто несовместимы со старыми TLB/DLL !). Так что всё что нужно было сделать - это снести папку Debug, и откомпилировать проект заново!!! biggrin.gif biggrin.gif biggrin.gif

LOL

Автор: mr.DUDA 2.2.2004, 16:05
Странно, но скомпилированный под 98-ой виндой EXE-шник не работает в XP !
Скомпилированный под XP не работает под 98-ой -- это понятно: в XP-шке библиотеки новее, и т.п.
Но почему EXE, привязанный к старым DLL-кам (mshtml.dll и shdocvw.dll), не работает с новыми confused.gif ? В COM заложен принцип обратной совместимости, почему в этому случае он не срабатывает ?

Автор: Step 3.2.2004, 10:53
mr.DUDA, не работает, или не находит новые дллки

Автор: mr.DUDA 3.2.2004, 13:54
Цитата
mr.DUDA, не работает, или не находит новые дллки

Не компилится или не запускается ?

З.Ы. запускать нужно в той же винде, под которой всё компилировалось, иначе ничего не получится. Я попробую написать пример без использования #import.

Автор: Step 3.2.2004, 15:11
mr.DUDA, это я у тебя спрашивал, по поводу совместимости, какая ошибка именно возникает.

Автор: mr.DUDA 3.2.2004, 15:52
Находит все нужные длл-ки и запускается по любому, но когда доходит до строки
Цитата
spHtmlDocument->get_body(&spHtmlElement);

генерируется исключение. Причём если компилировать и запускать всё в одной версии винды, то ошибки нету. Если же, например, запустить скомпилированный под 98-й виндой EXE-шник из-под Win2000 или XP, то ошибка появляется. Или например если запустить из-под 98-ой винды файл скомпиленный в XP.

Автор: Step 3.2.2004, 16:25
Попробуй в гет боди варинатом кидать....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)