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

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

ru
Offline Offline

« : 24-06-2009 06:52 » 

1. Как получать сообщения другого окна?
Приложение запускает ИЕ через ShellExecuteA(hWnd,"open",PATH,NULL,NULL,SW_MAXIMIZE), а потом ждет нажатия кнопки мыши, кое-где написано что первый аргумент и указывает на родительское окно, которое должно получать сообщения, однако при закрытии hWnd, IE продолжает работать, ну и конечно сообщений никаких не получает...
Это ведь можно как-то делать без хуков?

2.Как заставить окно IE перейти по адресу? Может быть есть какое-нибудь сообщение(SendMessage)? Или через SetWindowCaption для адресной строки?


3. Можете предложить несколько идей по сохранению картинки с сайта, о которой я знаю лишь ее кординаты?
Эмулировать копирование в буффер обмена, а потом сэйвить? Или есть пути проще?

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

Записан
Джон
просто
Администратор

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

« Ответ #1 : 24-06-2009 07:26 » 

Ничего не понял. Окна, сообщения, ИЕ... А нельзя ли просто сказать, что ты хочешь? Что значит "сообщения дургого окна"? Окно сообщения не отправляет, а получает.

Для управления же ИЕ можно посмотреть в сторону DDE или же, что ещё лучше, Browser Helper Object.  Инфы в инете куча.

3. А это обязательно делать через ИЕ? Может самому получить html-код, пропарсить, вытащить адрес картинки и сгрузить? ИМХО самый чистый способ. Координаты как-то настораживают. А если сместятся?

ps сразу скажу, что занимался таким очень давно и деталей не помню, даже проекта наверное не сохранилось. Задача была для своего мессенджера (сторонней программой) собирать URL задаваемые пользователем. Решалось именно так.
« Последнее редактирование: 24-06-2009 07:28 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Arthur
Интересующийся

ru
Offline Offline

« Ответ #2 : 24-06-2009 08:24 » 

Понятно что ничего не понятно)
1. Это я ступил, ведь окна получают сообщения от системы... Тогда вопрос как мне поставить мое приложение на получение WM_LBUTTONUP, сделанные вне моего приложения? Вроде как-то надо ставить в очередь получения...
И для самообразования вопрос, как система определяет кому принадлежит WM_LBUTTONUP и кому слать?

2. В будущем можно попробовать... Но сейчас хотелось бы попроще сделать.  Хотя я вообще не знаю с чего тут начинать:
   а). либо эмулировать действия юзера
   б).слать сообщение на открытие http в определенное окно
 
   а). вообще не представляю как...
   б).Вопрос какое сообщение? Или как вообще это реализовать?

3. Не координаты не сместятся... Подругому не сделать, потому что у картинки кроме координат я больше ничего не знаю... А картинка на сайте не одна...

 Тут то проблем нет, посылаем курсор-> жмем правую кнопку мыши-> выбираем пункт меню копировать-> выгружаем рисунок из буфера обмена....

Или Взять адрес объекта по координатам->открыть на сохранение

Вопрос как это сделать? Или в какую сторону хотя бы смотреть?
Ну или какие вообще идеи есть?
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #3 : 24-06-2009 08:31 » 

Что сделать-то вообще надо?
Записан

Удачного всем кодинга! -=x[PooH]x=-
zubr
Гость
« Ответ #4 : 24-06-2009 08:34 » 

Цитата
1. Как получать сообщения другого окна?
Если уже IE открыт, делаешь следующее:
1. Создаешь объект интерфейса IShellWindows: CreateInstance (__uuidof(SHDocVw::ShellWindows))
2. Получаешь количество шеллвиндоус используя метод IShellWindows::GetCount()
3. Получаешь указатели на объекты IDispatch перечисляя шеллвиндоус, используя метод IShellWindows::Item
4. Через полученные указатели IDispatch получаешь объекты IHTMLDocument2: QueryInterface (IID_IHTMLDocument2, ...
5. Отсортировать нужное окно IE. Для этого можно воспользоваться 2-мя вариантами:
5.1 По заголовку окна. Для этого сравниваем  IHTMLDocument2::get_title(...) с искомым заголовком.
5.2 По url окна IE. Для этого через полученные указатели IDispatch получаешь объекты IWebBrowser2: QueryInterface (IID_IWebBrowser2, ... Сравниваем искомый url cIWebBrowser2::get_LocationURL(...)
6. Получив интерфейс  IWebBrowser2, для него можно установить обработчики событий: BeforeNavigate2, DocumentComplete, DownloadComplete и т. д.
Цитата
2.Как заставить окно IE перейти по адресу? Может быть есть какое-нибудь сообщение(SendMessage)? Или через SetWindowCaption для адресной строки?
Использовать метод интерфейса IWebBrowser2::Navigate
Цитата
3. Можете предложить несколько идей по сохранению картинки с сайта, о которой я знаю лишь ее кординаты?
Эмулировать копирование в буффер обмена, а потом сэйвить? Или есть пути проще?
Сначала надо определить (получить объект картинки - интерфейс IHTMLElement). Для этого надо перечислять все объекты IHTMLDocument2 отсеивая только элементы с тэгом img. Получив объект IHTMLElement можно получить его смещение IHTMLElement::ofsetLeft, Top, Width, Height, а также значение тэга src (чтобы получить url картинки). Для сохранения картинки можно воспользоваться функцией URLOpenBlockingStream.
Записан
Джон
просто
Администратор

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

« Ответ #5 : 24-06-2009 08:34 » 

Система не определяет. Она просто ставит в очередь сообщений и рабочй тред приложения обрабатывает эту очередь отправляя всем известным ему окнам. Окно само решает, обрабатывает оно его или нет, или передаёт дальше и тд.

С помощью SetCapture можно получать все сообщения мыша.

3. Ну тогда делай так.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Arthur
Интересующийся

ru
Offline Offline

« Ответ #6 : 24-06-2009 08:42 » 

Да друг забыл пароль от фтп, надо все картинки у себя же тырить))

Спасибо, буду пробовать. А то в Интернете подобное находил, но понять с какого конкретно конца начинать не мог...
Записан
Arthur
Интересующийся

ru
Offline Offline

« Ответ #7 : 24-06-2009 09:13 » 

zubr, а там точно CreateInstance ? Что то не хочет работать, хотя вроде библиотеки
#include "objbase.h"
#include "exdisp.h" //IShellWindows
подключились , в msdn я его не нахожу...
http://msdn.microsoft.com/en-us/library/cc836570(VS.85).aspx#Mtps_DropDownFilterText
Записан
zubr
Гость
« Ответ #8 : 24-06-2009 10:12 » 

Arthur, ищи в MSDN по ключевой фразе: How To Connect to a Running Instance of Internet Explorer
Записан
Джон
просто
Администратор

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

« Ответ #9 : 24-06-2009 10:20 » 

Arthur, если это одноразовое задание. То не проще ли воспользоваться готовым софтом, сгрузить ВСЁ и выбрать что нужно?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Arthur
Интересующийся

ru
Offline Offline

« Ответ #10 : 24-06-2009 14:51 » 

Я перемудрил с вопросами... Прочитал несколько статей и понял сообщениеzubr. Поэтому немного переформулирую вопрос: мне бы браузер запустить, да так чтобы с ним потом общатся можно было...

Попробовал так:

Код:

      HRESULT hr1 ;
WebBrowser2 *m_pBrowser
CoInitializeEx(NULL,COINIT_MULTITHREADED);
            //Создаем браузер ИЕ с прикрученным интерфейсом взаимодействия
hr1 = CoCreateInstance (CLSID_InternetExplorer, NULL, CLSCTX_INPROC_SERVER,IID_IWebBrowser2,
(VOID **)&m_pBrowser);

На что получаю hr1= 0x80040154 Класс не зарегистрирован    HRESULT. Иестесвенно никакого окна... А методом тыка понял что это по поводу 3го параметра...

Записан
zubr
Гость
« Ответ #11 : 24-06-2009 15:45 » 

Вместо CLSCTX_INPROC_SERVER сделай CLSCTX_LOCAL_SERVER и не забудь m_pBrowser->put_Visible установить в true.
Записан
Arthur
Интересующийся

ru
Offline Offline

« Ответ #12 : 24-06-2009 15:54 » 

Вот блин как все просто! я лол. С++ блин повсюду свой синтаксис... ведь я грешил на то что просто не вижу окно. Спасибо большое)
Записан
Arthur
Интересующийся

ru
Offline Offline

« Ответ #13 : 24-06-2009 17:11 » 

И снова проблема...
   hr1= m_pBrowser->Navigate(L"ссылка",0,NULL,NULL,NULL);
Вызываю сразу после создания браузера, пробовал с паузой..

На что мне отвечают     hr1   0x800706f4 Заглушке передан нулевой указатель ссылки.    HRESULT
Записан
zubr
Гость
« Ответ #14 : 24-06-2009 17:47 » 

Так там же тип VARIANT, просто NULL не пройдет. Я делал когда то класс для работы с IE, вот код метода Navigate (используются некоторые классы MFC):
Код:
void CIEHelper::Navigate (LPCTSTR lpszURL, DWORD dwFlags,
      LPCTSTR lpszTargetFrameName,
      LPCTSTR lpszHeaders,
      LPVOID lpvPostData,
      DWORD dwPostDataLen)
{
     if (m_pWebBrowser == NULL)
return;

CString strURL (lpszURL);
     BSTR bstrURL = strURL.AllocSysString ();
     char *MBCS_buffer;
     COleSafeArray vPostData;

     if (lpvPostData != NULL)
     {
if (dwPostDataLen == 0)
dwPostDataLen = lstrlen ((LPCTSTR) lpvPostData) /** sizeof(TCHAR)*/;

  if (sizeof(TCHAR) == 2)
{
             MBCS_buffer = new char[dwPostDataLen + 1];
             ::WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)lpvPostData, dwPostDataLen, MBCS_buffer,
                        dwPostDataLen + 1, NULL, NULL);
             vPostData.CreateOneDim (VT_UI1, dwPostDataLen, MBCS_buffer);
             delete MBCS_buffer;
}
else
vPostData.CreateOneDim (VT_UI1, dwPostDataLen, lpvPostData);
     }

     m_pWebBrowser->Navigate (bstrURL, COleVariant ((long) dwFlags, VT_I4), COleVariant (lpszTargetFrameName, VT_BSTR),
vPostData, COleVariant (lpszHeaders, VT_BSTR));

     SysFreeString (bstrURL);
};
Записан
Arthur
Интересующийся

ru
Offline Offline

« Ответ #15 : 24-06-2009 19:05 » 

Какая то полная ерунда...

VARIANT vFlags = {8}, vTargetFrameName={0}, vPostData={0}, vHeaders={0};

                        
ShowWindow(hwndFound, SW_SHOWMAXIMIZED);
hr1= m_pBrowser->Navigate(L"asdsd", &vFlags, &vTargetFrameName, &vPostData, &vHeaders);

Он в строку адреса вбивает "http:///" до этого строка вообще пустая была...

С флагами что только не делал...
Записан
zubr
Гость
« Ответ #16 : 24-06-2009 21:11 » 

Проверь, возможно IE в автономном режиме.
Записан
Arthur
Интересующийся

ru
Offline Offline

« Ответ #17 : 25-06-2009 07:10 » 

Не, на домашнюю страницу он выходит... В интернете куча примеров, и везде так сделано, что интересно может еще не так быть? Может он типо что то не успевает доделать?
Записан
sss
Специалист

ru
Offline Offline

« Ответ #18 : 25-06-2009 08:50 » 

Arthur, а может все таки применишь
Код:
BSTR bstrURL = SysAllocString( L"asdsd");
hr1= m_pBrowser->Navigate( bstrURL, &vFlags, &vTargetFrameName, &vPostData, &vHeaders);
Записан

while (8==8)
Arthur
Интересующийся

ru
Offline Offline

« Ответ #19 : 28-06-2009 19:42 » 

sss,  большое спасибо заработало)

zubr, тоже огромное спасибо за алгоритм использования средств, 2 и 3 пункт практически сделал и все работает, но пока есть один вопрос:

"6. Получив интерфейс  IWebBrowser2, для него можно установить обработчики событий: BeforeNavigate2, DocumentComplete, DownloadComplete и т. д." Только вот как их установить? И я не нашел событий нажатия мыши...
Записан
zubr
Гость
« Ответ #20 : 28-06-2009 20:23 » 

Цитата
Получив интерфейс  IWebBrowser2, для него можно установить обработчики событий: BeforeNavigate2, DocumentComplete, DownloadComplete и т. д." Только вот как их установить?
Тут 2 пути:
1. Создавать свой клас на базе MFC-класса CCmdTarget с использованием макроса:
Код:
BEGIN_DISPATCH_MAP(CIEHelper, CCmdTarget)
DISP_FUNCTION_ID(CIEHelper, "OnQuit",DISPID_ONQUIT,OnQuit,VT_EMPTY, VTS_NONE)
DISP_FUNCTION_ID(CIEHelper, "BeforeNavigate2",DISPID_BEFORENAVIGATE2,BeforeNavigate2,
VT_EMPTY, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
DISP_FUNCTION_ID(CIEHelper, "DocumentComplete",DISPID_DOCUMENTCOMPLETE,DocumentComplete,
VT_EMPTY, VTS_DISPATCH VTS_PVARIANT)
DISP_FUNCTION_ID(CIEHelper, "DownloadBegin",DISPID_DOWNLOADBEGIN,DownloadBegin,VT_EMPTY, VTS_NONE)
    DISP_FUNCTION_ID(CIEHelper, "NavigateComplete2",DISPID_NAVIGATECOMPLETE2,NavigateComplete2,VT_EMPTY, VTS_DISPATCH VTS_PVARIANT)
    DISP_FUNCTION_ID(CIEHelper, "NavigateError",DISPID_NAVIGATEERROR,NavigateError,VT_EMPTY,
                 VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
    DISP_FUNCTION_ID(CIEHelper, "ProgressChange",DISPID_PROGRESSCHANGE,ProgressChange,VT_EMPTY, VTS_I4 VTS_I4)
    DISP_FUNCTION_ID(CIEHelper, "StatusTextChange",DISPID_STATUSTEXTCHANGE,StatusTextChange,VT_EMPTY, VTS_WBSTR)
    DISP_FUNCTION_ID(CIEHelper, "TitleChange",DISPID_TITLECHANGE,TitleChange,VT_EMPTY, VTS_WBSTR)
DISP_FUNCTION_ID(CIEHelper, "DownloadComplete",DISPID_DOWNLOADCOMPLETE,DownloadComplete,VT_EMPTY, VTS_NONE)
    DISP_FUNCTION_ID(CIEHelper, "NewWindow2",DISPID_NEWWINDOW2,NewWindow2,VT_EMPTY, VTS_PDISPATCH VTS_PBOOL)
END_DISPATCH_MAP()
2. Через механизм Connection Point.
Посмотри, вот неплохая статья на эту тему: http://www.rsdn.ru/?mag/0002/dhtmlspy.xml
Цитата
И я не нашел событий нажатия мыши...
У IWebBrowser нет событий нажатия мыши. Для этого надо:
1. Через Connection Point подключить диспинтерфейс HTMLDocumentEvents к документу
 2. Получить коллекцию элементов документа и к каждому элементу через Connection Point подключить диспинтерфейс HTMLElementEvents, или другой вариант получив элемент по определенным координатам  (IHTMLDocument2::elementFromPoint) подключать к нему диспинтерфейс HTMLElementEvents
Записан
Arthur
Интересующийся

ru
Offline Offline

« Ответ #21 : 11-08-2009 14:53 » 

Прошу прощение за долгое отсутсвие программа почти готова, остался последний мазок: сохранение картинки. Вот код если кому то понадобится:

Код:
#include "resource.h"
#include "Winuser.h"
#include "Windows.h"


#include "objbase.h" //COM
#include "exdisp.h" //IShellWindows
#include "Mshtml.h"





Код:

CoInitializeEx(NULL,COINIT_MULTITHREADED); //инициализация

//Создание инстанса приложения(CLSID_InternetExplorer-типо IE, можно и другие браузеры но надо
//баловатся с реестром), ID_IWebBrowser2-тип интерфейса(та штука через которую будем общатся с
//инстансом ИЕ) hr1-проверка запуска(HRESULT) если S_OK все норм,m_pBrowser-сам интерфейс


hr1 = CoCreateInstance (CLSID_InternetExplorer, NULL,CLSCTX_LOCAL_SERVER,IID_IWebBrowser2, (VOID **)&m_pBrowser);


if(hr1==S_OK){


//Дурак поймет) Коглда писал забыл, пол дня искал ошибку
m_pBrowser->put_Visible(true);


//Пляска с бубном вокруг дурацкого типа вариант.... ХЗ как работает, но работает
VARIANT vFlags = {0}, vTargetFrameName={0}, vPostData={0}, vHeaders={0};

m_pBrowser->get_HWND((SHANDLE_PTR*)&hwndFound);//Чтобы потом браузер убить....





int b=100;
VARIANT_BOOL busy;
IDispatch * iDisp;
IHTMLDocument2 * Html;
IHTMLElementCollection *HtmlCollection;
IHTMLElement *HtmlElement;
int i;
long p;
long x2;
long y2;

//Для VARIANT
OLECHAR* BUFFER = new OLECHAR[b + 1];//Бубен продолжается...
BUFFER[b] = '\0';//Бубен продолжается...
BUFFER[0]=b;//Бубен продолжается...



busy=VARIANT_TRUE;




SendMessage(HTML2,EM_GETLINE,NOMER_LINII,(LPARAM)BUFFER);//Взял из инпут бокса СТРОЧКУ

BSTR bstrURL = SysAllocString(BUFFER);

m_pBrowser->Navigate( bstrURL, &vFlags, &vTargetFrameName, &vPostData, &vHeaders); //Пошел по адресу BUFFER(строки из инпут бокса)





while(busy==VARIANT_TRUE){//Не нашел сразу подождать)))
m_pBrowser->get_Busy(&busy);
Sleep(1000);
}




m_pBrowser->get_Document(&iDisp);//Получил интерфейс !!!!СТРАНИЦЫ!!!
iDisp->QueryInterface(IID_IHTMLDocument2, (void**)&Html);

Html->get_images(&HtmlCollection);//Получил со страницы интерфейс ЭЛЕМЕНТОВ страницы

IDispatch *ppvdispOption;

//Перебор элементов страницы.....

p=0;
HtmlCollection->get_length(&p);//Количество элементов в p
VARIANT index2={0};
VARIANT PATH2[500];






for(i=0;i<p-1;i++){

VARIANT index;//СНОВА БУБЕН С ВАРИАНТОМ!!Стоил 3 часов опытов.....
index.lVal=i;
index.vt=2;
char BUFFER3[100];

hr1=HtmlCollection->item(index,index,&ppvdispOption);//Получаем интерфейс КОНКРЕТНОГО ЭЛЕМЕНТА
if(hr1==S_OK){
ppvdispOption->QueryInterface(IID_IHTMLElement ,(void **) &HtmlElement);//Получаем интерфейс КОНКРЕТНОГО ЭЛЕМЕНТА

HtmlElement->get_offsetLeft(&x2);//Координатки
HtmlElement->get_offsetTop(&y2);
if(x2<X1+2 && x2>X1-2){//Это уже мое..... Тут сравнение с эталоном
if(y2<Y1+5 && y2>Y1-5){
hr1=HtmlElement->getAttribute(L"src",4,PATH2);//Получение адреса ОЧЕНЬ ВАЖНО: тэг src а не URL!!!

hr1=hr1;


 

}
}

}

}
ppvdispOption->Release();


}

iDisp->Release();
Html->Release();
}
else{
MessageBoxA(NULL, "Браузер не запускается!", "SYSTEM", MB_ICONERROR);
}







И мой вопрос:
Нашел офигенную функцию:
URLDownloadToFile(0, _T("http://render.ru/gallery/show_image.php?work_id=41556&num=1"), _T("123.jpg"), 0, 0);
URLDownloadToFile(0, _T("http://render.ru/gallery/show_image.php?work_id=41556&num=1"), _T("С\\123.jpg"), 0, 0);

Сделал инклуд
#include "Urlmon.h"


Однако компилятор ругается:
Error   6   error LNK2019: unresolved external symbol _URLDownloadToFileA@20 referenced in function "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)   NEW1.obj

Перепробовал все уже....

Заранее благодарен, надеюсь мой код поможет новичкам)




Записан
Вад
Модератор

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

« Ответ #22 : 11-08-2009 18:20 » 

Библиотека Urlmon.lib в опции линкера добавлена? Эта функция находится в сторонней библиотеке, надо линковать.
Записан
Arthur
Интересующийся

ru
Offline Offline

« Ответ #23 : 13-08-2009 09:33 » 

Да действительно проблема с библиотекой....

Прошу прощения предыдущая версия не полностью работоспособна...

Код:
_TCHAR PATH_TO_SAVE[500];//Путь для сохранения
char BUFFER1[5];
HRESULT hr1;
int x;//Координаты картинки
int y;//Координаты картинки
VARIANT vFlags = {0}, vTargetFrameName={0}, vPostData={0}, vHeaders={0};

VARIANT_BOOL busy;



IDispatch * iDisp;//Нужно
IHTMLDocument2 * Html;//Нужно
IHTMLElementCollection *HtmlCollection;
IHTMLElement *HtmlElement;
IHTMLElement *HtmlElement2;


int i;
long p;
long x2;
long y2;

long x3;
long y3;

OLECHAR* BUFFER2 = new OLECHAR[201];
BUFFER2[200] = '\0';
BUFFER2[0]=200;


int dlinna_pyti=0;

OLECHAR* BUFFER3 = new OLECHAR[201];
BUFFER3[200] = '\0';
BUFFER3[0]=200;











dlinna_pyti=GetWindowText(InternetExplorer, PATH_TO_SAVE, 500);//Путь для сохранения

GetWindowTextA(inpX, BUFFER1,5);//Координаты картинки
x=atoi(BUFFER1);
GetWindowTextA(inpY,BUFFER1,5);
y=atoi(BUFFER1);



CoInitializeEx(NULL,COINIT_MULTITHREADED);
















//Create an Instance of web browser
hr1 = CoCreateInstance (CLSID_InternetExplorer, NULL,CLSCTX_LOCAL_SERVER,IID_IWebBrowser2, (VOID **)&m_pBrowser);
if(hr1==S_OK){
m_pBrowser->put_Visible(true);
m_pBrowser->get_HWND((SHANDLE_PTR*)&hwndFound);
ShowWindow(hwndFound, SW_SHOWMAXIMIZED);

int NOMER_LINII=0;
int Kolichestvo= SendMessage(HTML2,EM_GETLINECOUNT,0,0);

for(NOMER_LINII=0;NOMER_LINII<Kolichestvo;NOMER_LINII=NOMER_LINII+2){
int a_VS=SendMessage(HTML2,EM_GETLINE,NOMER_LINII,(LPARAM)BUFFER2);
BUFFER2[a_VS]='\0';



int a_VS2=SendMessage(HTML2,EM_GETLINE,NOMER_LINII+1,(LPARAM)BUFFER3);
BUFFER3[a_VS2]='\0';



int d;


char chars2[20];
wcstombs((CHAR*)&chars2,(OLECHAR*)BUFFER3,sizeof(chars2));
PATH_TO_SAVE[dlinna_pyti]='\\';
for(d=0;d<a_VS2;d++){
PATH_TO_SAVE[dlinna_pyti+d+1]=chars2[d];
}
PATH_TO_SAVE[dlinna_pyti+a_VS2+1]='.';
PATH_TO_SAVE[dlinna_pyti+a_VS2+2]='j';
PATH_TO_SAVE[dlinna_pyti+a_VS2+3]='p';
PATH_TO_SAVE[dlinna_pyti+a_VS2+4]='g';
PATH_TO_SAVE[dlinna_pyti+a_VS2+5]='\0';





// free memory of the OLECHAR-string
BSTR bstrURL = SysAllocString(BUFFER2);

m_pBrowser->Navigate( bstrURL, &vFlags, &vTargetFrameName, &vPostData, &vHeaders);

busy=VARIANT_TRUE;
while(busy==VARIANT_TRUE){//Ждем браузер....
m_pBrowser->get_Busy(&busy);
Sleep(1000);
}


m_pBrowser->get_Document(&iDisp);
iDisp->QueryInterface(IID_IHTMLDocument2, (void**)&Html);
Html->get_images(&HtmlCollection);

IDispatch *ppvdispOption;


p=0;
HtmlCollection->get_length(&p);


VARIANT index2={0};
VARIANT PATH2[500];

for(i=0;i<p;i++){
VARIANT index;
index.lVal=i;
index.vt=2;
/*char BUFFER3[100];*/

hr1=HtmlCollection->item(index,index,&ppvdispOption);

if(hr1==S_OK){
ppvdispOption->QueryInterface(IID_IHTMLElement ,(void **) &HtmlElement);

HtmlElement->get_offsetLeft(&x2);
HtmlElement->get_offsetTop(&y2);
hr1=NULL;
hr1=HtmlElement->get_offsetParent(&HtmlElement2);
while(hr1==S_OK && HtmlElement2!=0x00000000){
//MessageBoxA(NULL, "ТРАБЛА КАРТИНКА n степени вложенности!!! Разрабу влом решать проблему... Возможна неточность", "SYSTEM", MB_ICONERROR);
HtmlElement2->get_offsetLeft(&x3);
HtmlElement->get_offsetTop(&y3);
x2=x2+x3;
y2=y2+y3;
hr1=HtmlElement2->get_offsetParent(&HtmlElement2);

x3=0;
y3=0;
}





if(/*x2>130 && x2<140*/x2<x+5 && x2>x-5){
if(/*y2>=1060 && y2<1070*/y2<y+5 && y2>y-5){
/*VARIANT PATH3;
hr1=HtmlElement->getAttribute((BSTR)"src",4,&PATH3);
hr1=hr1;*/

VARIANT attr;
BSTR bstrtemp;
bstrtemp = SysAllocString(L"src");
HtmlElement->getAttribute(bstrtemp, 3, &attr);
hr1=hr1;











//hr1=URLDownloadToFileA(0, L "http://www.pen007.ru/pr/close.gif"/*attr.bstrVal*//*(LPCSTR)attr.bstrVal*/, L"F:\Documents and Settings\ART\Мои документы\Мои рисунки\8.jpg"/*(LPCWSTR)PATH_TO_SAVE*/, 0, 0);
//hr1=URLDownloadToFileA(0, "http://render.ru/gallery/show_image.php?work_id=41556&num=1"/*"attr.bstrVal*//*(LPCSTR)attr.bstrVal*/, "F:\Documents and Settings\ART\Мои документы\Мои рисунки\8.jpg"/*(LPCWSTR)PATH_TO_SAVE*/, 0, 0);
hr1=URLDownloadToFile(0, attr.bstrVal,PATH_TO_SAVE , 0, 0);
hr1=hr1;


}
}




}
ppvdispOption->Release();


}

iDisp->Release();
Html->Release();
}
}
else{
MessageBoxA(NULL, "Браузер не запускается!", "SYSTEM", MB_ICONERROR);
}



Кому надо может дергать куски кода, вроде бы работоспособен. Выкладываю также сам проект: программу которая анализирует список типа
1(ссылка на страницу с картинкой)
2
3
4
5

Переходит на страницы, и по координатам сохраняет картинку в заданный путь.

З.Ы. Программа абсолютно не стрессо устойчивая, в левое поле вводить код списка->нажать кнопку обработать-> в правом поле должно получится текст вида

ссылка
1
ссылка
2

В строку с: вводить путь куда сохранять в поля x и y координаты, и нажать кнопку начать


* NEW1.cpp (17.61 Кб - загружено 1549 раз.)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines