ShDocVw.dll InternetExplorer Object - «Доступ запрещен» при работе с локальным HTML-файлом - PullRequest
0 голосов
/ 10 февраля 2012
Dim IE As New ShDocVW.InternetExplorer
IE.Visible = True
IE.Navigate("C:\Users\m0180kb\desktop\test.html")
Do Until IE.Busy = False
Loop
IE.Document.All("testField").Value = "Testing"    'This line causes the error
IE.Close

Вот ошибка: Ошибка времени выполнения '-2147024891 (80070005)': доступ запрещен.

Дополнительная информация: кодирование выполняется в Excel VBA. Это работает, если я использую действительный URL вместо пути к файлу. Как только этот HTML-файл загружается в окно браузера, все объекты и свойства, связанные с объектом InternetExplorer, становятся бесполезными из-за ошибки «Отказано в доступе».

Один из обходных путей, о котором я подумал, - это сгенерировать .html-код через текстовый поток. Это позволило бы мне манипулировать полями формы, однако мне все еще нужно отправить html-форму через ShDocVW.dll, которая .... как вы уже догадались .... приводит к ошибке отказа в доступе.

Пожалуйста, дайте мне знать, если вы все равно знаете, как обойти эту ошибку, или знаете какие-либо записи реестра или параметры безопасности, которые могут позволить мне получить доступ к манипулированию локальным html-файлом через excel vba.

Спасибо

Ответы [ 2 ]

0 голосов
/ 10 февраля 2012

Я понял, в чем проблема. Это не имеет ничего общего с кодом или локальными настройками безопасности компьютера.

Мой файл .html на моем компьютере имеет 2 кадра, каждый из которых загружает свой веб-сайт. Из-за огромной угрозы безопасности, известной как межкадровый сценарий, все языки сценариев, такие как vba, javascript или любой другой язык, использующий mshtml.dll или shdocvw.dll, отключены, если в html-файле присутствуют 2 домена.

Есть способ заставить эту работу работать, но он включает добавление строки кода для обоих веб-сайтов, которые объединяются. По сути, если вы не являетесь владельцем веб-страницы, вы не можете добавить эту строку кода, которая не позволяет посторонним выполнять межкадровые сценарии на вашем сайте.

Это объясняет, почему мой тест работал через Интернет, а не когда я объединял 2 домена через фреймы на локальном диске. Зная это, я могу изменить свой подход и все же найти приемлемое решение.

Спасибо всем за предложения. Очень ценится.

0 голосов
/ 10 февраля 2012

Это работает для меня

Option Explicit

Sub Sample()
    Dim IE As Object, ieDoc As Object

    Set IE = CreateObject("InternetExplorer.Application")

    IE.Visible = True
    IE.Navigate ("C:\Users\m0180kb\desktop\test.html")

    Do While IE.ReadyState <> 4: DoEvents: Loop

    Set ieDoc = IE.Document

    ieDoc.getElementById("testField").Value = "Testing"

    'IE.quit
End Sub
...