// 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();
}