Я использую интерфейс IWebBrowser2 для отображения страницы из строки HTML, созданной во время выполнения. Я написал метод (назовем его DisplayHtmlString), который принимает строку HTML и отображает ее, как показано в этот пример. Метод также сначала вызывает Navigate2 с параметром «about:blank», чтобы убедиться, что документ присутствует, а также вызывает метод close после вызова записи.
При первом вызове DisplayHtmlString страница всегда отображается правильно, т. е. браузер отображает HTML в соответствии с переданной строкой. Проблема в том, что последующие вызовы иногда работают некорректно, а вместо этого отображают пустую страницу. Что может быть причиной этого?
Я обнаружил, что когда отображается пустая страница, это результат перехода к about:blank. Это было определено путем перехода к локальному файлу, который затем отображается (в то время как вместо этого должна отображаться строка HTML из-за последующей записи/закрытия). Таким образом, вызов Navigate2 работает, а вызовы write и close иногда не работают.
Я рассматривал внутренние проверки безопасности IE как возможную причину (междоменная проверка?), но я чувствую, что это не то, что здесь происходит.
Мне кажется более вероятным, что это какая-то проблема синхронизации, например, «IE еще не закончил рендеринг до следующего вызова DisplayHtmlString». Мой код изначально не проверял состояние готовности браузера (поскольку пример этого не делает). Я добавил экспериментальный цикл ожидания с вызовом get_readyState и заметил, что состояние никогда не выходило за рамки «загрузки» перед возвратом из метода — вероятно, потому, что рендеринг асинхронный (?). Я также заметил, что когда последовательные вызовы DisplayHtmlString работают правильно, основной цикл обработки сообщений программы запущен (что дает Windows возможность обрабатывать сообщения), чего нельзя сказать о сценарии, в котором последовательные вызовы DisplayHtmlString завершаются неудачно.
Так что я почти уверен, что мне нужно обеспечить правильную синхронизацию здесь, но как? Я заметил, что есть метод с именем onreadystatechange, но еще не экспериментировал с ним из-за множества других вещей, которые я пробовал, блуждая в темноте. Может ли это быть решением, и как правильно его использовать? Или, в качестве альтернативы, я должен просто обрабатывать цикл сообщений внутри DisplayHtmlString, пока состояние готовности не изменится на «завершено»?
ОБНОВЛЕНИЕ: добавлена обработка цикла сообщений в DisplayHtmlString. При первом вызове (который работает) состояние готовности становится «интерактивным», но не далее (что не кажется проблемой). В последующем вызове (когда он завершается с ошибкой) состояние готовности остается в состоянии «загрузка», даже если цикл обработки сообщений обрабатывается.