Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.16.76.43] |
|
Сообщ.
#1
,
|
|
|
Кто знает как запустить с WebBrowser-a html скрипт и получить обратно возвращаемые параметры. Желательно под Builder C++ v 4.0.
|
Сообщ.
#2
,
|
|
|
Вообще-то скрипты это те же COM-объекты, но проще все же запустить скрипт через window.execScript(...).
Если ты немного рубишь в объектной модели ХТМЛ, этим я все сказал. Если неясно, спрашивай ещё. |
Сообщ.
#3
,
|
|
|
... COM-объекты, но проще все же запустить скрипт через window.execScript(...)...
Вчера нашел экзампл на висуалах подобной тематики: Как вызвать скрипт из приложения? Автор: Тимофей Чадов При использовании WebBrowser Вы можете вызывать любые скрипты, расположенные в теле html-страницы. Обращение к скриптам производится через диспетчерский интерфейс, возвращаемый в свойстве Script интерфейса IHTMLDocument. В следующем примере демонстрируется вызов функции с именем evalute, которая определена в теле html-страницы следующим образом. <SCRIPT><br>function evaluate(x)<br>{<br> alert(x +"= " + eval(x));<br>}<br></SCRIPT> // Эта функция выполняет скрипт<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 <html><br><script language="javascript"><br><!--<br>function tst()<br>{<br> alert("FUCK YOU");<br>}<br>--><br></script><br>TEST<br></html> 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++ кинь сырцы или урлы. Заранее благодарен за помощь. |
Сообщ.
#4
,
|
|
|
Я набросаю щас в офлайне, завтра жди. или напомни по мылу, чтобы точно ответил.
|
Сообщ.
#5
,
|
|
|
Что-то сделал сэмпл, но он не хотел пахать. На VB то же самое работало... Но истина где-то рядом...
<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> |
Сообщ.
#6
,
|
|
|
И еще , если будут вопросы, как с тобой пообщаться в онлайне.
У меня на рамблере твой текст отображается бог зная в какой кодировке. Сенкс за екзампл. Будут вопросы напишу. Все удачи!!! |
Сообщ.
#7
,
|
|
|
Данная строчка 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 .*" может надо подключать что то еще. Заранее спасибо. |
Сообщ.
#8
,
|
|
|
В предыдущем сообщении сделал описку:
Если писать так LPDISPATCH pDisp = m_Browser.GetDocument(); (TWebBrowser m_Browser;) то компилятор(Builder C++ v 4.0) дает ошибку "Structure required on left side of . or .*" может надо подключать что то еще. Заранее спасибо. |