Является ли это допустимым способом вернуть HTMLDocument при очистке моего экземпляра InternetExplorer?
Private Function myFunction() As HTMLDocument
'init
Dim out As HTMLDocument
Dim browser As InternetExplorer
Set browser = CreateObject("InternetExplorer.Application")
...
'get HTMLDocument
Set out = browser.document
browser.Quit
Set browser = Nothing
Set myfunction = out
Exit Function
Я спрашиваю, потому что я получаю нестабильное поведение, используя возвращенный HTMLDocument позже в моем коде. Я увижу вывод 003, но не 004:
doc = myFunction()
...
Debug.Print "003"
strVar = doc.getElementsByClassName("sectionheading_center")(0).innerText
Debug.Print "004"
....
Ошибка: -2147417848-Automation error The object invoked has disconnected from its clients. -VBAProject-1000440-0


Вы потеряете динамическое взаимодействие, но сможете получить html, передав innerHTML в переменную MSHTML.HTMLDocument. Это также только тело html.
Private Function myFunction() As MSHTML.HTMLDocument
'init
Dim out As MSHTML.HTMLDocument
Dim browser As SHDocVw.InternetExplorer
Set browser = New SHDocVw.InternetExplorer
'...Other code
'get HTMLDocument
Set out = New MSHTML.HTMLDocument
out.body.innerHTML = browser.Document.innerHTML
browser.Quit
Set myFunction = out
Exit Function
Решение класса @ KostasK - это хороший способ поддерживать экземпляр экземпляра, а также место, где вы можете добавлять методы к этому объекту.
Интересно, если при передаче innerHTML, как мы обсуждаем, DOM будет анализироваться иначе, чем экземпляр IE? Я использую IE, потому что часть моей пользовательской базы получит разные результаты с точки зрения синтаксического анализа с использованием HTMLDocument, когда я использую ServerHTTP или XMLHTTP.
Вы переходите из ie.document, поэтому у вас будет document.body.innerHTML во время передачи в соответствии с ie.document.body. Если вам нужен синтаксический анализ ie html, а не синтаксический анализатор HTMLDocument DOM, просто перенесите обратно в ie.document.body. Если это действительно то, что вы хотите, то работа с классом, безусловно, лучший способ пойти, а затем передать экземпляр ie вокруг. Обратите внимание, что в обоих случаях есть document.mode/emulations, которые влияют на синтаксический анализ.
Только что заметил, что такое "SHDocVw" в вашем примере?
Это класс. Хорошей практикой является определение объекта Internet Explorer с его родительским классом.
Я согласен с предложением QHarr. Его решение может помочь вам с вашей проблемой. Вы можете протестировать его на своей стороне. Если все же вы получаете разные результаты, я предлагаю вам поделиться исходным кодом. Это может помочь нам воспроизвести проблему. Результаты тестирования могут помочь правильно понять проблему и сузить ее кругозор.
Не так, поскольку вы выпускаете ссылку на браузер. Создайте класс-оболочку, в котором вы создаете экземпляр браузера на
Intitialize()и очищаетеTerminate().