尝试使用SHDocVw.InternetExplorer.Document访问DOM时出错

时间:2012-01-17 16:41:38

标签: c# dom

我可以看到这是一个简单的修正,但它让我难过。

这是我得到的错误

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时,它失败了。

任何帮助都会很棒

2 个答案:

答案 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.dllmshtml个引用?

另外,检查你的时间。在投放文档时我有E_FAIL但导航未完成。所以你需要在执行演员表之前等待。