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 (заказчик ну очень хочет, хотя пока достаточно и для боди), за подсказку спасибо, буду пробовать
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.