Сначала несколько предостережений.Вообще говоря, надстройки такого типа (например, те, которые запускаются на всех страницах и сканируют весь контент) оказывают существенное влияние на производительность и могут привести к тому, что пользователи удалят или отключают надстройку, когда видят влияние на производительность, которое оно вызывает.Кроме того, кажется, что вы пишете свой код в .NET, что также настоятельно не рекомендуется из-за влияния на производительность.
Получение содержимого междоменного подкадра нетривиально, потому что вы получите AccessЗапрещено по умолчанию.Причина в том, что междоменное ограничение безопасности, которое существует для JavaScript, также применяется, когда ваша надстройка пытается получить междоменное содержимое.
Чтобы получить междоменное содержимое со страницы верхнего уровня, вы должны перепрыгнуть через некоторые нетипичные обручи, особенно в .NET.Лучше всего просто запустить код в событии DocumentComplete каждого фрейма, как заметил Джефф.
Если вам нужно выполнить код только один раз, со страницы верхнего уровня, то вы можете сделать это с помощью такой техники, каквот этот:
http://support.microsoft.com/default.aspx?scid=kb;en-us;196340
// &lpDocDisp is the dispatch pointer for the document
IHTMLDocument2* pDocument;
HRESULT hr = lpDocDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDocument);
if (FAILED(hr))
return hr;
long iCount = 0;
// Now, check for subframes
// http://support.microsoft.com/default.aspx?scid=kb;en-us;196340
IOleContainer* pContainer;
// Get the container
hr = lpDocDisp->QueryInterface(IID_IOleContainer, (void**)&pContainer);
if (FAILED(hr) || (NULL == pContainer)){
OutputDebugString("[AXHUNTER] Failed to get container\n");
return hr;
}
LPENUMUNKNOWN pEnumerator;
// Get an enumerator for the frames
hr = pContainer->EnumObjects(OLECONTF_EMBEDDINGS, &pEnumerator);
pContainer->Release();
if (FAILED(hr) || (NULL == pEnumerator)){
OutputDebugString("[AXHUNTER] Failed to get enumerator\n");
return hr;
}
IUnknown* pUnk;
ULONG uFetched;
// Enumerate all the frames
for (UINT i = 0; S_OK == pEnumerator->Next(1, &pUnk, &uFetched); i++)
{
assert(NULL != pUnk);
IWebBrowser2* pBrowser;
hr = pUnk->QueryInterface(IID_IWebBrowser2, (void**)&pBrowser);
pUnk->Release();
if (SUCCEEDED(hr))
{
LPDISPATCH pSubDoc = NULL;
hr = pBrowser->get_Document(&pSubDoc);
if (SUCCEEDED(hr) && (NULL != pSubDoc)){
CrawlPage(pSubDoc, ++iNested);
pSubDoc->Release();
}
pBrowser->Release();
}
else
{
OutputDebugString("[AXHUNTER] Cannot get IWebBrowser2 interface\n");
}
}
pEnumerator->Release();