IHTMLDocument2可以打开一个本地HTML文件, 并取得所有图片SRC属性吗? BSTR url = SysAllocString(L"c:\\zzz.html");
VARIANT name;
BSTR bstr_name = SysAllocString(OLESTR("_blank"));
name.vt = VT_BSTR;
name.bstrVal = bstr_name;
VARIANT feature;
BSTR str_feature = SysAllocString(OLESTR("channelmode = {yes|1}, directories = {yes|1},height = 150, left = 800, location = {no}, menubar = {no|0}, resizable = {no|0}, scrollbars = {no}, status = {no}, titlebar = {no}, toolbar = {no|0}, top = 500, width = 150"));
feature.vt = VT_BSTR;
feature.bstrVal = str_feature;
VARIANT replaces;
BSTR str_rep = SysAllocString(OLESTR("true"));
replaces.vt = VT_BSTR;
replaces.bstrVal = str_rep;
IDispatch *newDispatch; hr = pDoc->open(url, name, feature, replaces, &newDispatch);
if (hr != S_OK)
AfxMessageBox("error hr"); 执行显示: error hr.能打开本地html文件吗?如果此技术不行, 有本地html的解析类吗?
VARIANT name;
BSTR bstr_name = SysAllocString(OLESTR("_blank"));
name.vt = VT_BSTR;
name.bstrVal = bstr_name;
VARIANT feature;
BSTR str_feature = SysAllocString(OLESTR("channelmode = {yes|1}, directories = {yes|1},height = 150, left = 800, location = {no}, menubar = {no|0}, resizable = {no|0}, scrollbars = {no}, status = {no}, titlebar = {no}, toolbar = {no|0}, top = 500, width = 150"));
feature.vt = VT_BSTR;
feature.bstrVal = str_feature;
VARIANT replaces;
BSTR str_rep = SysAllocString(OLESTR("true"));
replaces.vt = VT_BSTR;
replaces.bstrVal = str_rep;
IDispatch *newDispatch; hr = pDoc->open(url, name, feature, replaces, &newDispatch);
if (hr != S_OK)
AfxMessageBox("error hr"); 执行显示: error hr.能打开本地html文件吗?如果此技术不行, 有本地html的解析类吗?
if (SUCCEEDED(hr = m_pMSHTML->get_all( &pColl ))) {
long cElems; assert(pColl); // 个数
if (SUCCEEDED(hr = pColl->get_length( &cElems ))) {
std::cout << "element counts: " << cElems << std::endl;
// 访问每个元素的属性, 比如 TAGNAME and HREF
for ( int i = 0; i < cElems; i++ ) {
VARIANT vIndex;
vIndex.vt = VT_UINT;
vIndex.lVal = i;
VARIANT var2 = { 0 };
LPDISPATCH pDisp; if (SUCCEEDED(hr = pColl->item( vIndex, var2, &pDisp ))) {
IHTMLElement* pElem = NULL;
if (SUCCEEDED(hr = pDisp->QueryInterface( IID_IHTMLElement, (LPVOID*)&pElem ))) {
_bstr_t bstrTag;
BSTR bstr; assert(pElem); hr = pElem->get_tagName(&bstr);
if (bstr) {
bstrTag = bstr;
SysFreeString(bstr);
} // 如果是 <IMG> 元素, 获取其 SRC 属性
IHTMLImgElement* pImage = NULL;
if (SUCCEEDED(hr = pDisp->QueryInterface( IID_IHTMLImgElement, (LPVOID*)&pImage ))) {
assert(pImage); pImage->get_src(&bstr);
if (bstr) {
bstrTag += " - ";
bstrTag += bstr;
SysFreeString(bstr);
}
pImage->Release();
} PrintBSTR(bstrTag); pElem->Release();
} // QI(IHTMLElement)
pDisp->Release();
} // item
} // for
} // get_length pColl->Release();
} // get_all
HRESULT
CHtmlDOM::loadFromMoniker(LPCTSTR szUrl)
{
if (!m_pDisp)
return S_FALSE; HRESULT hr; CSmartPtr<IMoniker> pMk;
if (SUCCEEDED(hr = CreateURLMoniker(NULL, szUrl, &pMk))) {
CSmartPtr<IBindCtx> pBCtx;
if (SUCCEEDED(hr = CreateBindCtx(0, &pBCtx))) {
// Use MSHTML moniker services to load the specified document
CSmartPtr<IPersistMoniker> pPMk;
if (SUCCEEDED(hr = m_pDisp->QueryInterface(IID_IPersistMoniker, (LPVOID*)&pPMk))) {
// Call Load on the IPersistMoniker
// 这里调用后立马返回, 文档此时仍未加载完毕
// 需要等到 MSHTML 报告 READYSTATE_COMPLETE 时刻.
// 查看 Site 实现上的 IPropertyNotifySink::OnChanged 函数
hr = pPMk->Load(FALSE, pMk, pBCtx, STGM_READ);
}
}
}
return hr;
}// 传统的持久化方式.
// MSHTML 也是使用异步加载的方式.HRESULT
CHtmlDOM::loadFromFile(LPCTSTR szUrl)
{
if (!m_pDisp)
return S_FALSE; HRESULT hr;
CSmartPtr<IPersistFile> pPF;
// MSHTML 支持常规文件持久化.
if ( SUCCEEDED(hr = m_pDisp->QueryInterface(IID_IPersistFile, (LPVOID*) &pPF))) {
hr = pPF->Load(szUrl, 0);
} return hr;
}// 流接口的加载
//HRESULT
CHtmlDOM::loadFromStream(IStream* pStream)
{
if (!m_pDisp)
return S_FALSE; HRESULT hr = S_OK;
CSmartPtr<IPersistStreamInit> pPSI;
//The IPersistStreamInit interface has InitNew and Load methods
//that are used to initialize and load an HTML document from a stream.
//The InitNew method initializes the stream to a known state
//and the Load method loads the HTML content from the stream.
if ( SUCCEEDED( hr = m_pDisp->QueryInterface(IID_IPersistStreamInit, (LPVOID*)&pPSI) )) {
hr = pPSI->InitNew();
hr = pPSI->Load(pStream);
}
return hr;
}
{
// TODO: 在此添加控件通知处理程序代码
HRESULT hr;
hr = CoInitialize(NULL); CComPtr<IPersistFile> pFile;
pFile.CoCreateInstance(CLSID_HTMLDocument);
if(pFile)
{
pFile->Load(L"c:\\zzz2.html",STGM_READ);
CComQIPtr<IHTMLDocument2> m_pMSHTML(pFile); IHTMLElementCollection* pColl = NULL;
if (SUCCEEDED(hr = m_pMSHTML->get_all( &pColl )))
{
long cElems; ASSERT(pColl); // retrieve the count of elements in the collection
if (SUCCEEDED(hr = pColl->get_length( &cElems )))
{
}
} // get_all
}
}
我把程序放在了一个OnButton中
但if (SUCCEEDED(hr = pColl->get_length( &cElems )))
虽然成功了, 但cElems 总为0, 知道为什么?用的vs2008.