Для не управляемого кода доступна COM оснастка IE. В нем есть усе..
| Код | // BSTR -> ANSI char* ToAnsi(BSTR String) { if (!String){ return new char('\0'); } int len = WideCharToMultiByte(CP_ACP, 0, String, -1, 0, 0, NULL, NULL); char* rv = new char[len]; WideCharToMultiByte(CP_ACP, 0, String, -1, rv, len, NULL, NULL); SysFreeString(String); return rv; }
char* GetHtmlBody(IHTMLDocument2* pDoc) { if(pDoc){ IHTMLElement *spHtmlElement = 0; if(SUCCEEDED(pDoc->get_body(&spHtmlElement))){ if(spHtmlElement != 0){ BSTR bstr; //spHtmlElement->get_outerHTML(&bstr); spHtmlElement->get_outerText(&bstr); spHtmlElement->Release(); return ToAnsi(bstr); //all ok. } }
} return new char('\0'); //error }
// НЕ (!) Рекурсивная обработка всех фреймов в документе char* GetFrameHTMLBodyByName(IHTMLDocument2* pDoc , char framename[]) { IHTMLFramesCollection2* FramesCollection; if (SUCCEEDED(pDoc->get_frames(&FramesCollection))) { // Получаем коллекцию фреймов long count; if (SUCCEEDED(FramesCollection->get_length(&count))) { for (int i = 0; i < count; i++) { VARIANT out_var , in_var; in_var.vt = VT_I4; in_var.lVal = i;
if (SUCCEEDED(FramesCollection->item(&in_var, &out_var))) { IHTMLWindow2* HtmlWindow; if (SUCCEEDED(out_var.pdispVal->QueryInterface(IID_IHTMLWindow2, (void**)&HtmlWindow))) { _bstr_t name; HtmlWindow->get_name(&name.GetBSTR()); if(name==_bstr_t(framename)){ IHTMLDocument2 * lpDocWindow; if(SUCCEEDED(HtmlWindow->get_document(&lpDocWindow))){ char* rv = GetHtmlBody(lpDocWindow); //чистим за собой перед выходом HtmlWindow->Release(); VariantClear(&out_var); FramesCollection->Release(); lpDocWindow->Release(); return rv; } } HtmlWindow->Release(); } VariantClear(&out_var); }
} } FramesCollection->Release(); } return new char('\0'); //error }
char* FindSiteFrameByName(char*site,char* name) { IShellWindows* m_spSHWinds; if (SUCCEEDED(CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL, IID_IShellWindows, (void **)&m_spSHWinds))){ VARIANT v; v.vt = VT_I4;
m_spSHWinds->get_Count(&v.lVal); for (long i = 0; i < v.lVal; i++){ _variant_t va(i, VT_I4); IDispatch* spDisp; if (SUCCEEDED(m_spSHWinds->Item(va, &spDisp)) && spDisp) { IWebBrowser2* spBrowser; if(SUCCEEDED(spDisp->QueryInterface(__uuidof(IWebBrowser2),(void**)&spBrowser)) && spBrowser != NULL){ BSTR strURL; if(SUCCEEDED(spBrowser->get_LocationURL(&strURL))){ char* docURL = ToAnsi(strURL); if(!strstr(docURL,site)) { free(docURL); continue; //не наш сайт -> пропускаем } free(docURL); IDispatch* spDisp2; if(spBrowser->get_Document(&spDisp2) == S_OK && spDisp!= 0){
IHTMLDocument2 *spHtmlDocument; if(SUCCEEDED(spDisp2->QueryInterface(IID_IHTMLDocument2, (void**) &spHtmlDocument))) { char* rv = GetFrameHTMLBodyByName(spHtmlDocument,"voc_shower_priv"); //чистимся перед выходом spDisp2->Release(); spBrowser->Release(); spDisp->Release(); m_spSHWinds->Release(); return rv; } spDisp2->Release(); } } spBrowser->Release(); } spDisp->Release(); } } m_spSHWinds->Release(); } return new char('\0'); //error? }
|
код немного кривоват.. стоит использоветь С++ врапперы всеже...а то ручками счиитать ссылки эээх... |