Control del navegador web: muestra el texto usando "escribir"

Estoy usando la interfaz IWebBrowser2 para representar una página a partir de una cadena HTML creada en tiempo de ejecución. He escrito un método (llamémoslo DisplayHtmlString) que toma una cadena HTML y la reproduce como se muestra eneste ejemplo. El método también llama a Navigate2 con "about: blank" primero, para asegurar que haya un documento presente, y también llama a cerrar después de llamar a write.

La primera vez que llamo a DisplayHtmlString, la página siempre se representa correctamente, es decir, el navegador muestra HTML de acuerdo con la cadena que paso. El problema es que las llamadas posteriores a veces no funcionan correctamente, sino que representan una página en blanco. ¿Qué podría estar causando esto?

Me he enterado de que cuando se muestra la página en blanco, este es el resultado de navegar a about: blank. Esto se determinó mediante la navegación a un archivo local, que luego se muestra (mientras que la cadena HTML debería mostrarse, debido a la subsiguiente escritura / cierre). Así que la llamada a Navigate2 funciona, mientras que las llamadas para escribir y cerrar a veces no lo hacen.

Consideré las verificaciones de seguridad internas de IE como una posible causa (verificación entre dominios?), Pero mi intuición es que esto no es lo que está sucediendo aquí.

Me parece más probable que se trate de algún tipo de problema de sincronización, en la línea de "IE no ha terminado de renderizarse hasta que llega la próxima llamada a DisplayHtmlString". Mi código originalmente no verificó el estado de preparación del navegador (porque el ejemplo no lo hace). Agregué un bucle de espera experimental con una llamada a get_readyState y observé que el estado nunca fue más allá de "cargar" antes de regresar del método, probablemente porque la representación es asíncrona (?). También me doy cuenta de que cuando las llamadas sucesivas a DisplayHtmlString funcionan correctamente, el ciclo de mensajes principal del programa se ha ejecutado (lo que le da a Windows la posibilidad de procesar mensajes), lo cual no es el caso en el caso de que las llamadas sucesivas a DisplayHtmlString fallen.

Así que estoy bastante seguro de que necesito proporcionar la sincronización correcta aquí, pero ¿cómo? Noté que hay un método llamado onreadystatechange, pero aún no he experimentado con eso, debido a la multitud de otras cosas que probé mientras buscaba a tientas en la oscuridad. ¿Podría ser esa la solución y cómo se usa correctamente? O, alternativamente, ¿debo simplemente procesar el bucle de mensajes dentro de DisplayHtmlString hasta que el estado listo cambie a "completo"?

ACTUALIZACIÓN: Se agregó el procesamiento de bucle de mensajes a DisplayHtmlString. En la primera llamada (que funciona), el estado listo se pone en "interactivo", pero no más (lo que no parece ser un problema). En la llamada subsiguiente (cuando falla), el estado listo permanece en "cargando", aunque se procesa el bucle de mensajes.

Respuestas a la pregunta(1)

Su respuesta a la pregunta