Re[4]: Вставка скрипта в BHO для IE
От: jed  
Дата: 12.07.11 02:10
Оценка: 10 (1)
L> "http://www.gm4ie.com/gm4ie_src.zip" is closed. Can anyone give me a copy ? My email is 'luchenue[at]gmail.com' .

http://rghost.net/14248801
Re: Вставка скрипта в BHO для IE
От: dudkin  
Дата: 28.04.11 18:10
Оценка: 2 (1)
Здравствуйте, Vicul, Вы писали:

V>Всем привет,


V>Короче текст "text1" вижу, работу скрипта нет.

V>Любые идеи..

Смотри GreeseMonkey for IE
они это делают давно и успешно
сорс код тут http://www.gm4ie.com/gm4ie_src.zip
Re: Вставка скрипта в BHO для IE
От: okman Беларусь https://searchinform.ru/
Дата: 28.04.11 18:14
Оценка: 2 (1)
Здравствуйте, Vicul, Вы писали:

V>Всем привет,


V>написал аддон для IE, который должен вставлять скрипт в страницу, загружаемую на IE.

V>Вообщем я могу вставить любой текст в страницу, но не могу заставить работать скрипт,
V>IE просто его игнорирует.
V>Вот часть кодов:

V>const BSTR g_script =L"<script type=\"text/javascript\" DEFER> alert('foobar');</SCRIPT>";


Первое, что бросается в глаза — некорректное использование BSTR.
Это не то же самое, что указатель на wchar_t, потому что BSTR хранит длину строки и
вообще с этим типом данных нужно работать через Sys(Re)AllocString/SysFreeString, либо
с помощью ATL-овских оберток CComBSTR.
Лично сталкивался с некоторыми непонятными проблемами, которые сразу же исчезали после
приведения подобных фрагментов с BSTR к правильному виду. Что и Вам настоятельно
советую сделать.

V>void STDMETHODCALLTYPE CBHOinject::OnDocumentComplete(IDispatch *pDisp, VARIANT *URL)

V>{
V> if (m_pMainDisp != pDisp)
V> return;
V> IHTMLElement* pEl = NULL;
V> HRESULT hr;
V>...........
V> hr = pEl->insertAdjacentHTML(L"afterBegin", g_script);
V> if (!SUCCEEDED(hr))
V> {.....// error}
V>.......
V>}

Хм, интересно было бы посмотреть весь код.
На самом деле внедрить элемент <script> на страницу — не такая уж и сложная задача, и
делать это можно по-разному.

Дам подсказку — через указатель на документ нужно создать новый элемент
(IHTMLDocument2::createElement), затем заполнить его атрибуты (IHTMLElement::setAttribute)
соответствующими значениями (type="text/javascript", src="URL" defer="false"), а
затем "прикрепить" этот новый созданный элемент к уже существующему, например, к <body>.
Как добраться до <body> — думаю, задача посильная, см. IHTMLDocument2::get_body и другие.

Проверено на IE 6-8, Win32/x64.
Re: Вставка скрипта в BHO для IE
От: alexey_ma Израиль  
Дата: 29.04.11 07:26
Оценка: 2 (1)
Здравствуйте, Vicul, Вы писали:

V>Всем привет,


V>написал аддон для IE, который должен вставлять скрипт в страницу, загружаемую на IE.

V>Вообщем я могу вставить любой текст в страницу, но не могу заставить работать скрипт,
V>IE просто его игнорирует.
V>Вот часть кодов:
....
V>Любые идеи..
Я как-то выкладывал пример здесь
Автор: alexey_ma
Дата: 24.11.10
. Посмотрите, возможно найдете что-то полезное.
Re: Вставка скрипта в BHO для IE
От: okman Беларусь https://searchinform.ru/
Дата: 28.04.11 18:24
Оценка: 1 (1)
Забыл добавить.

Еще есть симпатичный способ внедрения скриптов на — в DOM страницы
добавляется функция на Javascript-е, а затем ее тело вызывается через IDispatch::Invoke.
Единственный побочный эффект — имя функции теоретически может оказаться не уникальным.
Вставка скрипта в BHO для IE
От: Vicul  
Дата: 28.04.11 15:34
Оценка:
Всем привет,

написал аддон для IE, который должен вставлять скрипт в страницу, загружаемую на IE.
Вообщем я могу вставить любой текст в страницу, но не могу заставить работать скрипт,
IE просто его игнорирует.
Вот часть кодов:

const BSTR g_script =L"<script type=\"text/javascript\" DEFER> alert('foobar');</SCRIPT>";

void STDMETHODCALLTYPE CBHOinject::OnDocumentComplete(IDispatch *pDisp, VARIANT *URL)
{
if (m_pMainDisp != pDisp)
return;
IHTMLElement* pEl = NULL;
HRESULT hr;
...........
hr = pEl->insertAdjacentHTML(L"afterBegin", g_script);
if (!SUCCEEDED(hr))
{.....// error}
.......
}


Я пытался делать разные варианты с g_script

L"<h1>text1</h1><script type=\"text/javascript\" DEFER> alert('foobar');</SCRIPT>";
or
L"<script type=\"text/javascript\" DEFER> alert('foobar');</SCRIPT><h1>text1</h1>";

Короче текст "text1" вижу, работу скрипта нет.

Любые идеи..
Re: Вставка скрипта в BHO для IE
От: Freid  
Дата: 28.04.11 16:12
Оценка:
Здравствуйте, Vicul, Вы писали:

V>написал аддон для IE, который должен вставлять скрипт в страницу, загружаемую на IE.

V>Вообщем я могу вставить любой текст в страницу, но не могу заставить работать скрипт,
V>IE просто его игнорирует.
V>Вот часть кодов:

V>const BSTR g_script =L"<script type=\"text/javascript\" DEFER> alert('foobar');</SCRIPT>";


V>void STDMETHODCALLTYPE CBHOinject::OnDocumentComplete(IDispatch *pDisp, VARIANT *URL)

V>{
V> if (m_pMainDisp != pDisp)
V> return;
V> IHTMLElement* pEl = NULL;
V> HRESULT hr;
V>...........
V> hr = pEl->insertAdjacentHTML(L"afterBegin", g_script);
V> if (!SUCCEEDED(hr))
V> {.....// error}
V>.......
V>}

По-моему, событие OnDocumentComplete вызывается уже после того, как страница была загружена и скрипты отработали. То есть, просто добавлять в текст свой скрипт уже поздно.
Re[2]: Вставка скрипта в BHO для IE
От: Vicul  
Дата: 29.04.11 06:27
Оценка:
D>сорс код тут http://www.gm4ie.com/gm4ie_src.zip

спасибо за линк, сейчас пересмотрю
Re[2]: Вставка скрипта в BHO для IE
От: Vicul  
Дата: 29.04.11 06:43
Оценка:
O>с помощью ATL-овских оберток CComBSTR.

Уже сделал.


O>Хм, интересно было бы посмотреть весь код.


вот

CComBSTR g_script (L"<SCRIPT type=\"text/javascript\" DEFER> alert('foobar');</SCRIPT>");


void STDMETHODCALLTYPE CBHOinject::OnDocumentComplete(IDispatch *pDisp, VARIANT *URL)
{

if (m_pMainDisp != pDisp)
return;
CComPtr<IDispatch> spDoc;
HRESULT hr = m_spWebBrowser->get_Document(&spDoc);

if(SUCCEEDED(hr))
{
CComQIPtr<IHTMLDocument2> spHTMLDoc = spDoc;

if(NULL != spHTMLDoc)
{
IHTMLElementCollection* pElColl = NULL;
hr = spHTMLDoc->get_all(&pElColl);
if ( SUCCEEDED(hr))
{
long len = 0;
pElColl->get_length(&len);
if (len)
{
CComBSTR objectTag(L"head");
VARIANT vTag;
vTag.vt = VT_BSTR;
vTag.bstrVal = objectTag;
IHTMLElementCollection *pHeadColl = NULL;
IDispatch* pIDispColl = NULL;
hr = pElColl->tags(vTag, &pIDispColl);
if (!SUCCEEDED(hr))
return;
hr = pIDispColl->QueryInterface(IID_IHTMLElementCollection, (void**) &pHeadColl);
if (!SUCCEEDED(hr))
return;
len = 0;
pHeadColl->get_length(&len);
if (len)
{
VARIANT index;
index.vt = VT_INT;
index.intVal = 0;
IHTMLElement* pEl = NULL;
IDispatch* pdisp = NULL;
hr = pHeadColl->item(index, index, &pDisp);
if (SUCCEEDED(hr))
{
hr = pDisp->QueryInterface(IID_IHTMLElement, (LPVOID*)&pEl);
if (SUCCEEDED(hr))
{

CComBSTR src;
hr = pEl->get_innerHTML(&src);
if(SUCCEEDED(hr))
{
CString str(src.m_str);
len = str.GetLength();
if (len != 0)
{
str.Insert(len, g_script);
// hr = pEl->put_innerHTML(str.AllocSysString());
hr = pEl->insertAdjacentHTML(L"afterBegin", g_script);
if (!SUCCEEDED(hr))
{
switch (hr)
{
case S_OK:
str = L"S_OK";
break;
case S_FALSE:
str = L"S_FALSE";
break;
case E_ABORT:
str = L"E_ABORT";
break;
case E_ACCESSDENIED:
str = L"E_ACCESSDENIED";
break;
case E_FAIL:
str = L"E_FAIL";
break;
case E_HANDLE:
str = L"E_HANDLE";
break;
case E_INVALIDARG:
str = L"E_INVALIDARG";
break;
case E_NOINTERFACE:
str = L"E_NOINTERFACE";
break;
case E_NOTIMPL:
str = L"E_NOTIMPL";
break;
case E_OUTOFMEMORY:
str = L"E_OUTOFMEMORY";
break;
case E_POINTER:
str = L"E_POINTER";
break;
case E_UNEXPECTED:
str = L"E_UNEXPECTED";
break;
default:
str.Format(L"Unknown error: 0x%x", hr);
break;
}
AfxMessageBox(str);
}
}
}
}
}
}
}
}
}
}

}

на концовый switch(hr) не обращай внимание, я его для диагностики влепил


O>Дам подсказку — через указатель на документ нужно создать новый элемент

O>(IHTMLDocument2::createElement), затем заполнить его атрибуты (IHTMLElement::setAttribute)
O>соответствующими значениями (type="text/javascript", src="URL" defer="false"), а
O>затем "прикрепить" этот новый созданный элемент к уже существующему, например, к <body>.
O>Как добраться до <body> — думаю, задача посильная, см. IHTMLDocument2::get_body и другие.

вообще то нужно в head (заказчик ну очень хочет, хотя пока достаточно и для боди), за подсказку спасибо, буду пробовать
Re[2]: Вставка скрипта в BHO для IE
От: Vicul  
Дата: 29.04.11 06:47
Оценка:
O>Еще есть симпатичный способ внедрения скриптов на — в DOM страницы
O>добавляется функция на Javascript-е, а затем ее тело вызывается через IDispatch::Invoke.
O>Единственный побочный эффект — имя функции теоретически может оказаться не уникальным.

Идея интересная, но мне не подойдет, в реале там будет урл-ка, где функции будут меняться
Re[2]: Вставка скрипта в BHO для IE
От: Vicul  
Дата: 29.04.11 10:29
Оценка:
V>>Любые идеи..
_>Я как-то выкладывал пример здесь
Автор: alexey_ma
Дата: 24.11.10
. Посмотрите, возможно найдете что-то полезное.


Спасибо, очень интересная штучка!
Re[2]: Вставка скрипта в BHO для IE
От: Vicul  
Дата: 29.04.11 12:30
Оценка:
O>Дам подсказку — через указатель на документ нужно создать новый элемент
O>(IHTMLDocument2::createElement), затем заполнить его атрибуты (IHTMLElement::setAttribute)
O>соответствующими значениями (type="text/javascript", src="URL" defer="false"), а
O>затем "прикрепить" этот новый созданный элемент к уже существующему, например, к <body>.
O>Как добраться до <body> — думаю, задача посильная, см. IHTMLDocument2::get_body и другие.


Сделал через это заработало!!!
Всем спасибо
Re[3]: Вставка скрипта в BHO для IE
От: Stalcer2  
Дата: 05.07.11 16:59
Оценка:
Здравствуйте, Vicul, Вы писали:

V>Сделал через это заработало!!!

V>Всем спасибо

Выложи плз пример проекта, аналогичная задача, очень нужно.
Re[2]: Вставка скрипта в BHO для IE
От: jed  
Дата: 08.07.11 02:33
Оценка:
D>сорс код тут http://www.gm4ie.com/gm4ie_src.zip

Похоже сервера там теперь нет и яайла тоже. Не могли бы вы выложить этот gm4ie_src.zip куда-нибудь, если он сохранился?
Re[3]: Вставка скрипта в BHO для IE
От: luchenue  
Дата: 12.07.11 01:39
Оценка:
"http://www.gm4ie.com/gm4ie_src.zip" is closed. Can anyone give me a copy ? My email is 'luchenue[at]gmail.com' .
Re[5]: Вставка скрипта в BHO для IE
От: luchenue  
Дата: 12.07.11 02:31
Оценка:
Здравствуйте, jed, Вы писали:

L>> "http://www.gm4ie.com/gm4ie_src.zip" is closed. Can anyone give me a copy ? My email is 'luchenue[at]gmail.com' .


jed>http://rghost.net/14248801


THX
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.