我可以看到这是一个简单的修正,但它让我难过。
这是我得到的错误
COMException未处理
错误HRESULT E_FAIL已从调用COM组件返回。
这是代码(我已将网址空白但它们有效)
class SMSHandler
{
private InternetExplorer ie;
private object URL = "##########";
private object URL2 = "###########";
public SMSHandler()
{
ie = new InternetExplorer();
ie.Visible = true;
}
public void openMACS()
{
object Empty = 0;
ie.Navigate2(ref URL, ref Empty, ref Empty, ref Empty, ref Empty);
while (ie.Busy);
ie.Navigate2(ref URL2, ref Empty, ref Empty, ref Empty, ref Empty);
IHTMLDocument2 HTMLDoc = (IHTMLDocument2)ie.Document;
}
这是产生错误的行
IHTMLDocument2 HTMLDoc = (IHTMLDocument2)ie.Document;
网页打开正常但是当我尝试将文档分配给IHTMLDocument2时,它失败了。
任何帮助都会很棒
答案 0 :(得分:5)
您忘记等待页面加载完成。一会儿(即.Busy);循环非常难看,你不想在等待IE完成时刻录100%的核心。请改用DocumentComplete事件。还有一台状态机可以跟踪您的位置。像这样:
private int state = 0;
public SMSHandler()
{
ie = new InternetExplorer();
ie.DocumentComplete += ie_DocumentComplete;
ie.Visible = true;
}
void ie_DocumentComplete(object pDisp, ref object URL) {
object Empty = 0;
if (state == 1) {
ie.Navigate2(ref URL2, ref Empty, ref Empty, ref Empty, ref Empty);
state++;
}
else if (state == 2) {
IHTMLDocument2 HTMLDoc = (IHTMLDocument2)ie.Document;
// etc..
state = 0;
}
}
public void openMACS()
{
object Empty = 0;
state = 1;
ie.Navigate2(ref URL, ref Empty, ref Empty, ref Empty, ref Empty);
}
考虑使用WebBrowser类,这样您就不必在进程外运行IE。 This answer向您展示了如何在单独的线程中运行它。这是您在代码中获得E_FAIL的可能原因。
答案 1 :(得分:0)
代码在我本地工作,但我会为你解决。
查看ie.Document
类型。对我来说,它返回mshtml.HTMLDocumentClass
,它实现了IHTMLDocument2
接口。也许你没有引用适当的DLL。我假设您手动添加了SHDocVw.dll
和mshtml
个引用?
另外,检查你的时间。在投放文档时我有E_FAIL
但导航未完成。所以你需要在执行演员表之前等待。