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

Chr*_*rew 0 c# dom

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

这是我得到的错误

COMException未处理

错误HRESULT E_FAIL已从调用COM组件返回.

这是代码(我已经删除了URL,但它们是有效的)

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;

    }
Run Code Online (Sandbox Code Playgroud)

这是产生错误的行

IHTMLDocument2 HTMLDoc = (IHTMLDocument2)ie.Document;
Run Code Online (Sandbox Code Playgroud)

网页打开正常,但是当我尝试将文档分配给IHTMLDocument2时,它失败了.

任何帮助都会很棒

Han*_*ant 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);
}
Run Code Online (Sandbox Code Playgroud)

考虑使用WebBrowser类,因此您不必在进程外运行IE. 这个答案向您展示了如何在一个单独的线程中运行它.这是您在代码中获得E_FAIL的一个非常可能的原因.