参考了凤之焚的专栏:http://blog.csdn.net/lion_wing/article/details/769742
但是他的源码有些问题,即IHTMLElementCollection接口的item应该填写正确的序列号,而不是0。
item序列号递增是深度优先的遍历标签,不明白的可以试一下,也就是说如果只用0序列号的话获得的是<!Document>的标签,1才是<html>标签内容,他俩是并列的。我这里是IE11做的实验,博主当年发文的时候不知道情况怎么样……
另外注意要使用IHTMLElement的outerHTML,innerHTML只会获得标签里的内容,不包含标签。
int detect_AppCache(IHTMLDocument2* pDocument) { CComPtr<IHTMLElementCollection> spHTML; HRESULT hr = pDocument->get_all(&spHTML); long length = 0; spHTML->get_length(&length); if (hr == S_OK && spHTML != NULL) { for (int i = 0; i < length ; i++){//注意一下,这里i=1就可以获得普遍意义的所有源代码 CComVariant svarIndex = i; CComVariant svarEmpty; CComPtr<IDispatch> spDisp; hr = spHTML->item(svarIndex, svarEmpty, &spDisp); if ( SUCCEEDED(hr) ) { CComQIPtr<IHTMLElement> spElement = spDisp; if (spElement) { CComBSTR bstrHTML; spElement->get_outerHTML(&bstrHTML); USES_CONVERSION; CString ret = COLE2T(bstrHTML); if (ret.Find(_T("appcache")) != -1) { MessageBox(NULL, L"he", L"detect_AppCache", MB_OK); } MessageBox(NULL, ret, L"detect_AppCache", MB_OK); } } else { MessageBox(NULL, L"获取IDispatch失败", L"detect_AppCache", MB_ABORTRETRYIGNORE); } } } return 0; }