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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.