TWebBrowser调用QueryInterface获取IID_IHTMLElement2始终返回E_NOINTERFACE求助
错误原因
- 你调用
QueryInterface的对象是IHTMLDocument2类型的文档对象,而IHTMLElement2是HTML元素类接口,两类接口所属的COM对象完全不同,跨对象查询接口必然返回E_NOINTERFACE错误。 - 你需要先从文档对象中取出
<body>对应的元素接口,再针对元素对象查询IHTMLElement2接口。
实现body.focus()的修正方案
正确代码示例
WebBrowser1->Navigate(L"c:\\test.htm"); while (WebBrowser1->Busy) Application->ProcessMessages(); DelphiInterface<IHTMLDocument2> diDoc = WebBrowser1->Document; if (diDoc) { DelphiInterface<IHTMLElement> diRawBody; // 第一步:先从文档对象获取body的基础元素接口 if (SUCCEEDED(diDoc->get_body(&diRawBody)) && diRawBody) { DelphiInterface<IHTMLElement2> diBodyElement; // 第二步:对body元素查询IHTMLElement2接口 if (SUCCEEDED(diRawBody->QueryInterface(IID_IHTMLElement2, reinterpret_cast<void**>(&diBodyElement))) && diBodyElement) { diBodyElement->focus(); } } }
额外注意事项
- 建议不要只用
WebBrowser1->Busy判断加载状态,最好监听DocumentComplete事件再操作DOM,避免页面未完全加载时get_body返回空指针的问题。 - 如果页面存在iframe,需要先获取对应iframe的文档对象再取body元素,当前代码只适用于顶层页面。
内容的提问来源于stack exchange,提问作者Coder12345
相关产品推荐
相关产品推荐

