На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> WeBrowser запуск html скрипта
    Кто знает как запустить с WebBrowser-a html скрипт и получить обратно возвращаемые параметры. Желательно под Builder C++ v 4.0.
      Вообще-то скрипты это те же COM-объекты, но проще все же запустить скрипт через window.execScript(...).
      Если ты немного рубишь в объектной модели ХТМЛ, этим я все сказал. Если неясно, спрашивай ещё.
        ... COM-объекты, но проще все же запустить скрипт через window.execScript(...)...

        Вчера нашел экзампл на висуалах подобной тематики:

        Как вызвать скрипт из приложения?
        Автор: Тимофей Чадов
        При использовании WebBrowser Вы можете вызывать любые скрипты, расположенные в теле html-страницы. Обращение к скриптам производится через диспетчерский интерфейс, возвращаемый в свойстве Script интерфейса IHTMLDocument.

        В следующем примере демонстрируется вызов функции с именем evalute, которая определена в теле html-страницы следующим образом.


        ExpandedWrap disabled
          <SCRIPT><br>function evaluate(x)<br>{<br>    alert(x +"= " + eval(x));<br>}<br></SCRIPT>



        ExpandedWrap disabled
          // Эта функция выполняет скрипт<br>void CMyHtmlView::OnCallscript()<br>{<br>    HRESULT hr;<br>    LPDISPATCH pDispatch = GetHtmlDocument();<br>    if( pDispatch == NULL ) return;<br><br>    IHTMLDocument* pHtmlDoc;<br>    hr = pDispatch->QueryInterface( __uuidof( IHTMLDocument ), (void**)&pHtmlDoc );<br><br>    LPDISPATCH pScript;<br>    pHtmlDoc->get_Script( &pScript);<br>    pScript->AddRef();<br>    if (SUCCEEDED(hr))<br>    {<br>        // Получаем DISPID интересуемой функции<br>        OLECHAR* szMember = L"evaluate";<br>        DISPID dispid;<br><br>        HRESULT hr = pScript->GetIDsOfNames(IID_NULL, &szMember, 1,<br>            LOCALE_SYSTEM_DEFAULT, &dispid);<br><br>        if (SUCCEEDED(hr))<br>        {<br>            // Выполняем<br>            COleVariant vtResult;<br>            static BYTE parms[] = VTS_BSTR;<br><br>            COleDispatchDriver dispDriver(pScript);<br>            dispDriver.InvokeHelper(dispid, DISPATCH_METHOD, VT_VARIANT,<br>                (void*)&vtResult, parms,<br>                "5+Math.sin(9)");<br>        }<br>    }<br>    pScript->Realease();<br>    pHtmlDoc->Release();<br>    pDispatch->Release();<br>}


        ---------------------------------------------------------------------------------------
        делал подобное на Builder C++ v 4.0

        ExpandedWrap disabled
          <html><br><script language="javascript"><br><!--<br>function tst()<br>{<br> alert("FUCK YOU");<br>}<br>--><br></script><br>TEST<br></html>


        ExpandedWrap disabled
          void __fastcall TForm1::FormCreate(TObject *Sender)<br>{<br> WebBrowser1->Navigate2(&TVariant(GetCurrentDir() + "\\iehost.htm"));<br>}<br>//---------------------------------------------------------------------------<br>void __fastcall TForm1::Button1Click(TObject *Sender)<br>{<br> IHTMLDocument2 *htmlDocument;<br> if(SUCCEEDED(WebBrowser1->Document->QueryInterface(IID_IHTMLDocument2,(LPVOID*)&htmlDocument)))<br> {<br>  IHTMLElementCollection* pScript;<br>  htmlDocument->get_scripts(&pScript);<br>  pScript->AddRef();<br><br>  OLECHAR* szMember = L"tst";<br>  DISPID dispid;<br><br>  HRESULT hr2=pScript->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_SYSTEM_DEFAULT, &dispid);<br>  if(!SUCCEEDED(hr2))<br>  {<br>   MessageBox(HWND_DESKTOP,"ERROR","",MB_OK);<br>   return;<br>  }<br> }<br>}



        но дает ошибку еще на стадии GetIDsOfNames. В чем ошибка незнаю. Если есть екзамплы на builder c++ кинь сырцы или урлы. Заранее благодарен за помощь.
        Сообщение отредактировано: SUnteXx -
          Я набросаю щас в офлайне, завтра жди. или напомни по мылу, чтобы точно ответил.
            Что-то сделал сэмпл, но он не хотел пахать. На VB то же самое работало... Но истина где-то рядом...

            ExpandedWrap disabled
              <br><br>void CScriptExecDlg::OnExecScript() <br>{<br>      CHAR szScript[100];<br>      GetDlgItemText(IDC_SCRIPT, szScript, sizeof(szScript) - 1);<br><br>      //////////////////////////////////////////////////////////////////////////<br>      <br>      LPDISPATCH pDisp = m_Browser.GetDocument();<br><br>      IHTMLDocument2* pDoc;<br><br>      if(SUCCEEDED(pDisp->QueryInterface(IID_IHTMLDocument2, (LPVOID*) &pDoc)))<br>      {<br>            pDisp->Release();<br><br>            IHTMLWindow2* pWin;<br><br>            if(FAILED(pDoc->get_parentWindow(&pWin)))<br>            {<br>                  pDoc->Release();<br>                  return;<br>            }<br><br>            BSTR bstrScript = SysAllocString((OLECHAR*) szScript);<br>            BSTR bstrLang = SysAllocString((OLECHAR*) "");<br>            VARIANT varRet;<br><br>            if(FAILED(pWin->execScript(bstrScript, bstrLang, &varRet)))<br>            {<br>                  AfxMessageBox("Îøèáêà çàïóñêà ñêðèïòà!");<br>            }<br><br>            pDoc->Release();<br>            pWin->Release();<br><br>            SysFreeString(bstrScript);<br>            SysFreeString(bstrLang);<br>      } else      pDisp->Release();<br>      <br>}<br><br>
              И еще , если будут вопросы, как с тобой пообщаться в онлайне.
              У меня на рамблере твой текст отображается бог зная в какой кодировке.
              Сенкс за екзампл. Будут вопросы напишу. Все удачи!!!
                Данная строчка LPDISPATCH pDisp = m_Browser.GetDocument();
                равнасильна LPDISPATCH pDisp = m_Browser->Document;, где TWebBrowser m_Browser;?
                Eсли НЕТ, то каким образом до нее дойти имея только в наличии TWebBrowser m_Browser. А то в многих экзамплах видел, но не знаю каким образом это сделать.

                Если писать так
                LPDISPATCH pDisp = m_Browser->Document;
                то компилятор(Builder C++ v 4.0) дает ошибку "Structure required on left side of . or .*"
                может надо подключать что то еще.

                Заранее спасибо.



                  В предыдущем сообщении сделал описку:

                  Если писать так  
                  LPDISPATCH pDisp = m_Browser.GetDocument();  (TWebBrowser m_Browser;)
                  то компилятор(Builder C++ v 4.0) дает ошибку "Structure required on left side of . or .*"
                  может надо подключать что то еще.

                  Заранее спасибо.
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0267 ]   [ 16 queries used ]   [ Generated: 18.04.24, 22:52 GMT ]