Ошибка при попытке доступа к DOM с помощью SHDocVw.InternetExplorer.Document - PullRequest
0 голосов
/ 17 января 2012

Я вижу, что это простое исправление, но это меня озадачило.

Это ошибка, которую я получаю

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;

    }

Это строка, которая генерирует ошибку

IHTMLDocument2 HTMLDoc = (IHTMLDocument2)ie.Document;

Веб-страница открывается нормально, однако, когда я пытаюсь присвоить документ IHTMLDocument2, он не работает.

Любая помощь будет отличной

Ответы [ 2 ]

5 голосов
/ 18 января 2012

Вы забыли дождаться завершения загрузки страницы.В то время как (т. Е. Автобус);Цикл довольно уродливый, вы не хотите сжигать 100% ядра, ожидая завершения IE.Вместо этого используйте событие 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 вне процесса. Этот ответ показывает, как запустить его в отдельном потоке.Это очень вероятная причина, по которой вы получили E_FAIL в своем коде.

0 голосов
/ 17 января 2012

Код работает локально для меня, но я возьму для вас взлом.

Взгляните на тип ie.Document.Для меня это возвращает mshtml.HTMLDocumentClass, который реализует интерфейс IHTMLDocument2.Возможно, вы не ссылаетесь на соответствующие библиотеки DLL.Я полагаю, вы добавили SHDocVw.dll и mshtml ссылки вручную?

Кроме того, проверьте время.У меня был E_FAIL при приведении документа, но навигация не была завершена.Поэтому вам нужно подождать, прежде чем выполнять приведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...