2

IWebBrowser2 インターフェイスを使用して、実行時に作成された HTML 文字列からページをレンダリングしています。この例に示すように、HTML 文字列を取得してレンダリングするメソッド (DisplayHtmlString と呼びましょう) を作成しました。このメソッドは、最初に「about:blank」を指定して Navigate2 を呼び出し、ドキュメントが存在することを確認し、write を呼び出した後に close も呼び出します。

初めて DisplayHtmlString を呼び出すと、ページは常に正しくレンダリングされます。つまり、ブラウザーは、渡した文字列に従って HTML を表示します。問題は、後続の呼び出しが正しく機能しない場合があり、代わりに空白のページが表示されることです。何が原因でしょうか?

空白のページが表示される場合、これは about:blank に移動した結果であることがわかりました。これは、代わりにローカル ファイルに移動することによって決定され、それが表示されます (ただし、その後の書き込み/クローズにより、代わりに HTML 文字列が表示されるはずです)。そのため、Navigate2 の呼び出しは機能しますが、write と close の呼び出しは機能しないことがあります。

考えられる原因として IE 内部のセキュリティ チェック (クロスドメイン チェック?) を考えましたが、私の直感では、これはここで起こっていることではありません。

「DisplayHtmlStringへの次の呼び出しが来る前に、IEはまだレンダリングを終了していません」という行に沿って、ある種の同期の問題である可能性が高いようです。私のコードは元々、ブラウザーの準備完了状態をチェックしていませんでした (この例ではチェックしていないため)。get_readyState への呼び出しで実験的な待機ループを追加し、メソッドから戻る前に状態が「読み込み」を超えていないことを確認しました - おそらくレンダリングが非同期であるためです (?)。また、DisplayHtmlString への連続した呼び出しが正しく機能する場合、プログラムのメイン メッセージ ループが実行されていることにも気付きました (Windows にメッセージを処理する機会を与えます)。これは、DisplayHtmlString への連続した呼び出しが失敗するシナリオには当てはまりません。

したがって、ここで正しい同期を提供する必要があると確信していますが、どうすればよいでしょうか? onreadystatechange という名前のメソッドがあることに気付きましたが、暗闇の中で手探りしながら試した他の多くのことのために、まだ実験していません。それが解決策になる可能性がありますか?それを正しく使用するにはどうすればよいでしょうか? または、代わりに、準備完了状態が「完了」に変わるまで、DisplayHtmlString 内のメッセージ ループを処理しますか?

更新: DisplayHtmlString にメッセージ ループ処理を追加しました。最初の呼び出し (これは動作します) では、準備完了状態は「対話型」になりますが、それ以上ではありません (これは問題ではないようです)。後続の呼び出し (失敗した場合) では、メッセージ ループが処理されても、準備完了状態は "読み込み中" のままです。

4

1 に答える 1