Привет!
Туточки есть замечательная статья о плагинах, даже две

Всё хорошо на многое открыли мне глаза, но есть один глюк с которым я не могу справиться

Я чуток изменил исходники для достижения следующего эффекта... для эмулирование нажатия на ссылках ,кнопках и т.д. и т.п. Всё ок работает(нажатие эмулирует), вот только один ньюанс.
Ситуация 1.
Допустим я эмулирую нажатие на ссылке на странице номер 1, грузится страница номер 2. Всё оки.
Ситуация 2.
Теперь я хочу сэмулировать клиик на странице номер один, а потом на странице номер 2. Вот тут и начинаются непонятки

Эмулирую нажатие на ссылке, потом в цикле жду пока страница якобы загрузится делаю так
while(state != READYSTATE_COMPLETE )
pWebBrowser2->get_ReadyState(&state);
//или вот так, всё один хе%
while(v_bool)
pWebBrowser2->get_Busy(&v_bool);*/
быстренько прохожу эти циклы, эмулирую нажатие на странице номер два, НО!! происходит ошибка потому что я обращаюсь к элементу на странице номер 2, а она ещё оказывается не загрузилась

Почему?!?!?!
Ладно идём далее. Если после эмулирования клика на странице 1 выдать банальный MessageBox то страница быстренько загрузится. Но а как без него?!?!?! вот полный кусочек. Надеюсь понятно объяснил!
void IMyIEExtention::OnCommand(UINT nID, HWND hCtrl, UINT nCode)
{
int h[16]={41, 43, 45, 47, 49, 51};
VARIANT_BOOL v_bool=true;
READYSTATE state;
if (nID == IDC_BUTTON)
{
IServiceProviderPtr pServiceProv(m_pSomething);
//IWebBrowser2Ptr pWebBrowser2;
pServiceProv->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2,(void**)&pWebBrowser2);
Click(0, "", h[0]);
LPCTSTR a="Click on first page.";
SendMessage(m_hList, LB_ADDSTRING, 0, (LPARAM)a);
while(state != READYSTATE_COMPLETE )
pWebBrowser2->get_ReadyState(&state);
while(v_bool)
pWebBrowser2->get_Busy(&v_bool);
MessageBox( NULL,"click on first page", "message", MB_OK | MB_SYSTEMMODAL);
Click(1, "submit1", 0);
}
}
void IMyIEExtention::Click(int type, char *name, int number)
{
HRESULT hRes=S_OK;
HWND hBrowser=NULL;
long l=0;
int i,y;
try
{
if(type == 0) // link
{
IDispatchPtr pDisp;
pWebBrowser2->get_Document(&pDisp);
IHTMLDocument2Ptr pHTMLDoc2(pDisp);
IHTMLElementCollectionPtr pHTMLColl;
hRes=pHTMLDoc2->get_links(&pHTMLColl);
l= (long) number;
hRes=pHTMLColl->item(_variant_t(l), _variant_t(l), &pDisp);
if (hRes == 0)
{
IHTMLElementPtr pHTMLElement(pDisp);
hRes=pHTMLElement->click();
return;
}
}
..............
..............
..............
}
catch (_com_error ce)
{
MessageBox(NULL, ce.ErrorMessage(), "error", MB_OK | MB_ICONSTOP);
return;
}
return;
}
Нужна делать MessagePump.
Поэтому при выводе диалогово окна все срабатывает.
George.
Здравствуйте, old->*Plutonia_Experiment(), Вы писали:
OE>Здравствуйте, mDok, Вы писали:
OE>Тебе надо делать цикл выборки сообщений. Такой цикл есть в MessageBox — потому все и работает.
Спасибо нашёл!
Простыми словами MessagePump — это обычный цикл выборки сообщений... да?
Здравствуйте, mDok, Вы писали:
D>Спасибо нашёл!
D>Простыми словами MessagePump — это обычный цикл выборки сообщений... да?
Именно так. Иногда, когда эксплорер вивсит достаточно кликнуть правой кнокой по иконе в таскбареЮ чтоб вывелось меню, тогда эксплорер отвисает на некоторое время
Видимо, код изначально был взят из "Программиста". Сам с него начал работать над этой темой.
Вот 2 ф-ии, которыми я бегал по ссылкам в своем плагине:
void DoEvents()
{
#define MAX_MESSAGES 0
MSG lpMsg;
int cnt = 0;
while (GetMessage(&lpMsg, NULL, 0, 0))
{
TranslateMessage(&lpMsg);
DispatchMessage(&lpMsg);
if (cnt++ > MAX_MESSAGES)
break;
}
}
void BrowseTo(_bstr_t &href, IWebBrowser2Ptr &pBrowser, IHTMLDocument2Ptr &pHTMLDoc2)
{
//href - куда идем
//pBrowser - браузер
//pHTMLDoc2 - ссылка на объект документа - возвращается в вызывающий код
HRESULT hRes;
IDispatchPtr pTmpDisp;
hRes = pBrowser->Navigate(href, NULL, NULL, NULL, NULL);
CHECK_COM_RESULT(hRes)
READYSTATE RState;
do
{
Sleep(100);
DoEvents();
pBrowser->get_ReadyState(&RState);
}
while (RState != READYSTATE_COMPLETE);
hRes = pBrowser->get_Document(&pTmpDisp);
CHECK_COM_RESULT(hRes)
pHTMLDoc2 = pTmpDisp;
}
В DoEvents пришлось добавлять сравнение с константой потому, что без него браузер весьма подзрительно зависал. Практика показала, что достаточно обработать всего одно сообщение. Какое там проходит — разбираться было лень.