IHTMLDocument2可以打开一个本地HTML文件, 并取得所有图片SRC属性吗?

yyyyy_3 2012-10-24 06:01:37
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的解析类吗?

...全文
771 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyyyy_3 2012-10-25
  • 打赏
  • 举报
回复
void CgfgfDlg::OnBnClickedButton2()
{
// 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.







Dobzhansky 2012-10-25
  • 打赏
  • 举报
回复
mshtml 的几种 load


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;
}

Dobzhansky 2012-10-25
  • 打赏
  • 举报
回复
  // 取得对所有元素集合的引用
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
breaksoftware 2012-10-25
  • 打赏
  • 举报
回复
这个和本地与否没有关系,主要是你获取接口指针可能不对,你参考下蒋晟给你的方案。
蒋晟 2012-10-25
  • 打赏
  • 举报
回复

CComPtr<IPersistFile> pFile;
pFile.CoCreateInstance(CLSID_HTMLDocument)
if(pFile)
{
pFile->Load(L"c:\\test1.htm",STGM_READ);
CComQIPtr<IHtmlDocument2> pDoc(pFile);
......
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧