16,472
社区成员
发帖
与我相关
我的任务
分享
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;
}
// 取得对所有元素集合的引用
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
CComPtr<IPersistFile> pFile;
pFile.CoCreateInstance(CLSID_HTMLDocument)
if(pFile)
{
pFile->Load(L"c:\\test1.htm",STGM_READ);
CComQIPtr<IHtmlDocument2> pDoc(pFile);
......
}