Управление веб-браузером - отображение текста с использованием «записи»

Я использую интерфейс IWebBrowser2 для рендеринга страницы из строки HTML, созданной во время выполнения. Я написал метод (давайте назовем его DisplayHtmlString), который принимает строку HTML и отображает ее, как показано на рисункеэтот пример, Метод также вызывает Navigate2 с «about: blank» первым, чтобы убедиться, что документ присутствует, и он также вызывает close после вызова write.

При первом вызове DisplayHtmlString страница всегда отображается правильно, т. Е. Браузер отображает HTML в соответствии со строкой, которую я передаю. Проблема в том, что последующие вызовы иногда не работают правильно, но вместо этого отображают пустую страницу. Что может быть причиной этого?

Я обнаружил, что когда отображается пустая страница, это результат перехода к about: blank. Это было определено путем перехода к локальному файлу, который затем отображается (тогда как вместо этого должна быть показана строка HTML, из-за последующей записи / закрытия). Таким образом, вызов Navigate2 работает, в то время как вызовы записи и закрытия иногда не работают.

Я рассматривал внутренние проверки безопасности IE как возможную причину (междоменная проверка?), Но мое внутреннее чувство заключается в том, что это не то, что здесь происходит.

Мне кажется более вероятным, что это какая-то проблема с синхронизацией, в соответствии с тем, что «IE еще не закончил рендеринг до следующего вызова DisplayHtmlString». Мой код изначально не проверял состояние готовности браузера (потому что пример не проверяет). Я добавил экспериментальный цикл ожидания с вызовом get_readyState и заметил, что состояние никогда не выходило за пределы «загрузки» до возврата из метода - возможно, потому что рендеринг асинхронный (?). Я также заметил, что, когда последовательные вызовы DisplayHtmlString работают правильно, основной цикл обработки сообщений программы запускается (что дает Windows возможность обрабатывать сообщения), что не имеет место в сценарии, когда последовательные вызовы DisplayHtmlString завершаются неудачно.

Так что я уверен, что мне нужно обеспечить правильную синхронизацию здесь, но как? Я заметил, что есть метод с именем onreadystatechange, но я еще не экспериментировал с ним из-за множества других вещей, которые я пробовал во время нащупывания в темноте. Может ли это быть решением, и как правильно его использовать? Или, в качестве альтернативы, я должен просто обработать цикл сообщений внутри DisplayHtmlString, пока состояние готовности не изменится на «завершено»?

ОБНОВЛЕНИЕ: Добавлена обработка цикла сообщений в DisplayHtmlString. При первом вызове (который работает) состояние готовности переходит в «интерактивное», но не дальше (что, по-видимому, не является проблемой). При последующем вызове (когда происходит сбой) состояние готовности остается на «загрузке», даже если цикл обработки сообщений обрабатывается.

Ответы на вопрос(1)

Ваш ответ на вопрос