更新-这不好用!
下面的代码不太好用!问题是——它失去了
<BODY>
标记属性。装载后,车身标签完全变空。我
最后用
IHTMLDocument2.write
方法
见:
Assigning IHTMLDocument2 instance to a TWebBrowser instance
在这里花了很多时间,没有任何指导之后,我相信当链接无效时,不可能避免这种等待20-30秒。我找到了另一个解决方案,如果有人想补充这个解决方案,请随意。
相反,我要做的是创建一个
CLSID_HTMLDocument
(
IHTMLDocument3
或
IHTMLDocument2
接口),然后将文档加载到该容器中,并在使用链接之前解析链接。以下是对这一点的描述:
https://docs.microsoft.com/en-us/previous-versions/aa703592(v=vs.85)
这也有助于:
How to load html contents from stream and then how to create style sheet to display the html file in preview pane (like HTML preview handler)
解析文档URL并修复无效URL后,可以将其保存/显示在实际应用程序中
TWebBrowser
.
粗略解决方案(C++Builder):
try
{
DelphiInterface<IHTMLDocument2> diDoc2;
OleCheck(CoCreateInstance(CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER, IID_IHTMLDocument2, (void**)&diDoc2));
DelphiInterface<IPersistStreamInit> diPersist;
OleCheck(diDoc2->QueryInterface(IID_IPersistStreamInit, (void**)&diPersist));
OleCheck(diPersist->InitNew());
DelphiInterface<IMarkupServices> diMS;
OleCheck(diDoc2->QueryInterface(IID_IMarkupServices, (void**)&diMS));
DelphiInterface<IMarkupPointer> diMkStart;
DelphiInterface<IMarkupPointer> diMkFinish;
OleCheck(diMS->CreateMarkupPointer(&diMkStart));
OleCheck(diMS->CreateMarkupPointer(&diMkFinish));
// ...Load from file or memory stream into your WideString here...
DelphiInterface<IMarkupContainer> diMC;
OleCheck(diMS->ParseString(WideString(MsgHTMLSrc).c_bstr(), 0, &diMC, diMkStart, diMkFinish));
DelphiInterface<IHTMLDocument2> diDoc;
OleCheck(diMC->QueryInterface(IID_PPV_ARGS(&diDoc)));
DelphiInterface<IHTMLElementCollection> diCol;
OleCheck(diDoc->get_all(&diCol));
long ColLen = 0;
OleCheck(diCol->get_length(&ColLen));
for (int i = 0; i < ColLen; ++i)
{
DelphiInterface<IDispatch> diItem;
diCol->item(OleVariant(i), OleVariant(i), &diItem);
DelphiInterface<IHTMLElement> diElem;
OleCheck(diItem->QueryInterface(IID_IHTMLElement, (void**)&diElem));
WideString wTagName;
OleCheck(diElem->get_tagName(&wTagName));
if (StartsText("img", wTagName))
{
OleVariant vSrc;
OleCheck(diElem->getAttribute(OleVariant("src"), 4, vSrc));
// Make changes to vSrc here....
// And save it back to src
OleCheck(diElem->setAttribute(OleVariant("src"), vSrc, 0));
}
else if (StartsText("script", wTagName))
{
// More parsing here...
}
}
}
catch (EOleSysError& e)
{
// Process exception as needed
}
catch (Exception& e)
{
// Process exception as needed
}
在完全解析所有必需元素之后(
img
/
src
,
script
/
src
,
base
/
href
等)保存并加载到
特威布朗瑟
.
我现在只需要看看解析后的HTML
IHTMLDocument2
可以直接分配给
特威布朗瑟
但这是另一个问题(参见-
将IHTMLDocument2实例分配给TWebBrowser实例
)