Plugin for IE.
От: mDok Украина  
Дата: 21.11.02 20:13
Оценка:
Привет!
Туточки есть замечательная статья о плагинах, даже две Всё хорошо на многое открыли мне глаза, но есть один глюк с которым я не могу справиться Я чуток изменил исходники для достижения следующего эффекта... для эмулирование нажатия на ссылках ,кнопках и т.д. и т.п. Всё ок работает(нажатие эмулирует), вот только один ньюанс.
Ситуация 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;
}
Re: Plugin for IE.
От: Аноним  
Дата: 21.11.02 20:49
Оценка:
Нужна делать MessagePump.
Поэтому при выводе диалогово окна все срабатывает.

George.
Re[2]: Plugin for IE.
От: mDok Украина  
Дата: 22.11.02 06:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Нужна делать MessagePump.

А>Поэтому при выводе диалогово окна все срабатывает.

А>George.


Если можно то разъясните плиз поподробней...
Re: Plugin for IE.
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.11.02 15:49
Оценка:
Здравствуйте, mDok, Вы писали:

Тебе надо делать цикл выборки сообщений. Такой цикл есть в MessageBox — потому все и работает.
Re[2]: Plugin for IE.
От: mDok Украина  
Дата: 24.11.02 14:20
Оценка:
Здравствуйте, old->*Plutonia_Experiment(), Вы писали:

OE>Здравствуйте, mDok, Вы писали:


OE>Тебе надо делать цикл выборки сообщений. Такой цикл есть в MessageBox — потому все и работает.


Спасибо нашёл!
Простыми словами MessagePump — это обычный цикл выборки сообщений... да?
Re[3]: Plugin for IE.
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.11.02 14:54
Оценка: 2 (1)
Здравствуйте, mDok, Вы писали:

D>Спасибо нашёл!

D>Простыми словами MessagePump — это обычный цикл выборки сообщений... да?


Именно так. Иногда, когда эксплорер вивсит достаточно кликнуть правой кнокой по иконе в таскбареЮ чтоб вывелось меню, тогда эксплорер отвисает на некоторое время
Re: Plugin for IE.
От: mik1  
Дата: 24.11.02 17:40
Оценка:
Видимо, код изначально был взят из "Программиста". Сам с него начал работать над этой темой.
Вот 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 пришлось добавлять сравнение с константой потому, что без него браузер весьма подзрительно зависал. Практика показала, что достаточно обработать всего одно сообщение. Какое там проходит — разбираться было лень.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.