// lists images on a html page #include #include #include #include #include #include #include #include #include #include HRESULT GetDocumentImages(IHTMLDocument2* pDoc, std::vector& imgNames) { HRESULT hr = S_OK; IHTMLElementCollection* pImages = NULL; if(SUCCEEDED(hr = pDoc->get_images(&pImages))) { long numImages = 0; if(SUCCEEDED(hr = pImages->get_length(&numImages))) { VARIANT vtIndex, vtEmpty; VariantInit(&vtIndex); VariantInit(&vtEmpty); V_VT(&vtIndex) = VT_UI4; imgNames.reserve(numImages); for(long i = 0; i < numImages; ++i) { V_UI4(&vtIndex) = i; LPDISPATCH pImageIntermediary = NULL; if(SUCCEEDED(pImages->item(vtIndex, vtEmpty, (LPDISPATCH*)&pImageIntermediary))) { IHTMLImgElement* pImage = NULL; if(SUCCEEDED(pImageIntermediary->QueryInterface(IID_IHTMLImgElement, (LPVOID*)&pImage))) { BSTR url; if(SUCCEEDED(pImage->get_src(&url))) { imgNames.push_back(url); SysFreeString(url); } pImage->Release(); } pImageIntermediary->Release(); } } VariantClear(&vtIndex); VariantClear(&vtEmpty); } pImages->Release(); } return hr; } int main(int argc, char** argv) { IWebBrowser2* pBrowser = NULL; HRESULT hr = S_OK; CoInitialize(NULL); if(SUCCEEDED(hr = CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, reinterpret_cast(&pBrowser)))) { BSTR url = SysAllocString(L"http://www.google.com/"); VARIANT vtOpts, vtEmpty; VariantInit(&vtOpts); VariantInit(&vtEmpty); V_VT(&vtOpts) = VT_UI4; V_UI4(&vtOpts) = navNoHistory | navNoReadFromCache | navOpenInNewWindow; if(SUCCEEDED(hr = pBrowser->Navigate(url, &vtOpts, &vtEmpty, &vtEmpty, &vtEmpty))) { VARIANT_BOOL vtBusy = VARIANT_TRUE; while(vtBusy) { Sleep(500); if(FAILED(pBrowser->get_Busy(&vtBusy))) { break; } } IHTMLDocument2* pDoc = NULL; LPDISPATCH pDisp = NULL; std::vector imageNames; if(SUCCEEDED(pBrowser->get_Document(&pDisp))) { if(SUCCEEDED(pDisp->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDoc))) { if(SUCCEEDED(GetDocumentImages(pDoc, imageNames))) { std::sort(imageNames.begin(), imageNames.end()); imageNames.erase(std::unique(imageNames.begin(), imageNames.end()), imageNames.end()); std::wcout << url << L" contains these images:\n"; std::copy(imageNames.begin(), imageNames.end(), std::ostream_iterator(std::wcout, L"\n")); } pDoc->Release(); } pDisp->Release(); } } VariantClear(&vtOpts); VariantClear(&vtEmpty); SysFreeString(url); pBrowser->Quit(); pBrowser->Release(); } CoUninitialize(); }