[Delphi]TWebBrowserを含むアプリでエラーが出る時

 

★本記事の注意点★

・記事の肝心な部分は他人様の記事へのリンクです。その方は C# 用の記事として書かれていましたが、Delphi で作成したプログラムにも該当することが判明したので、補足を加えて記述しました。

・すべての Delphi に対応しているとは限りません。

・プログラムソースの修正ではありません。動作させるPCのレジストリに値を追加する方法なので、事前のレジストリのバックアップを強く推奨します。

・この記事およびリンク先の記事を参考にされて発生した、いかなる事象も当方は責任を負うことはできません。実施された方の自己責任で行って下さい。


■概要

  1. TWebBrowserの概要
  2. どういった場合に不具合が出るのか?
  3. なぜ起こるのか?
  4. 対処法
  5. 謝辞と補足

 

1.TWebBrowserの概要

ヘルプより「TWebBrowser は、独自の Web ブラウザ アプリケーションを作成したり、インターネット、ファイル、およびネットワークのブラウズ機能、ドキュメント表示機能、およびデータ ダウンロード機能を独自のアプリケーションに追加できるようにするために、Microsoft の Shell Doc Object and Control Library(SHDOCVW.DLL)の IWebBrowser2 インターフェイスをラップしたものです・・・このコンポーネントを使用するには SHDOCVW.DLL がインストールされていなければなりません。この DLL は Internet Explorer 4 以降に付属しています」

要するに

自作アプリにブラウザを搭載する場合に便利なコントロールですが、動作させるOSにInternet Explorer (以下、IE)が必須であり、連動していることがわかります。

 

2.どういった場合に不具合が出るのか?

「TWebBrowserを含むソフト」がどういったタイミングでエラーが出たり、動かなくなる可能性があるのか推測すると、

「ソースをいじったり、リコンパイルしていない実行ファイル」であるにも関わらず

・パソコンを買い換えた時で、例えば Vistaなど以前のWindows から Win 10に変わった時

・Windowsのバージョンが変わった時で、例えばWin 7から10にアップグレードした時

・まれかもしれませんが、Internet Explorerのみをアップグレードした時

 

3.なぜ起こるのか?

TWebBrowserの基本動作および対処法を書かれた方の記事

●WebBrowser コントロールで使われている Internet Explorerを最新のバージョンに変更する

https://www.ipentec.com/document/document.aspx?page=csharp-change-webbrower-control-internet-explorer-version

 

によれば、「TWebBrowserは何も指定をしなければ IE 7 として動作」するそうです。

 

ここで、私が体験した不具合を説明しますと

Windows 10 + IE11 で自作アプリを動かし、youtube.com を表示したところ、「最新の Adobe Flash Playerをダウンロードして下さいという意味の英文が表示され、動画を再生できない」というものでした。

しかしご存知の通り Flash Playerは、Win 10ではOSの一部のように含まれたアプリとなっているため、別途ダウンロード・インストールする必要は通常はありません(編集時)

 

つまり、

自作アプリをWin 10 で動かすと、そのままではTWebBrowserはIE7 として動作。

本来OSがWin 10ならば IEのバージョンは 11 以降なのに、自作アプリ内のブラウザのIEが7 として稼働したので、”最新のFlash Playerのダウンロードが必要”、とyoutubeが警告してきたのではないか?と私は判断しました。

また、youtube以外の一般的なサイトならTWebBrowserは正常に動作していたので、「警告が出た」不具合は「Flash Playerを採用したサイトを表示した時に発生する可能性がある」ということになります。

Flashの件とは別ですが、同じ自作アプリ内でIEを動かした時にメモリ違反が出ることもありました(詳細は記事の最後にて)。

 

4.対処法

ログオンしているユーザーで正常に動作させる、という意図でレジストリエディタで下記のキーを探します


HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION


FEATURE_BROWSER_EMULATIONの右クリック→新規→DWORD(32ビット)値を作成します。

・値の名前

TWebBrowserを含む動かしたい自作のソフト名(通常、******.exe)

・値のデータ

その方の記事によれば複数のデータがありますが、TWebBrowserをIEの最新のバージョンとして動作させるには

10進数で 11001

(16進数で 0x2AF9)

と指定するそうです。

※キー名 FEATURE_BROWSER_EMULATIONが存在しない場合は、その方の記事

 

それ以外の

・TWebBrowserをIE 10, IE 9 として動作させる場合

・HKEY_CURRENT_USERではなくHKEY_LOCAL_MACHINEにキーを追加したい場合

は、その方の記事

https://www.ipentec.com/document/document.aspx?page=csharp-change-webbrower-control-internet-explorer-version

をご覧下さい。

 

5.謝辞と補足

以上のように「Delphiで作成したTWebBrowserを含むソフト名と値をレジストリに追加するだけ」で、TWebBrowserを希望のIEのバージョンで動かせることができることが判明しました。

 

その記事の方にこの場ですが、謝辞を述べたいと思います。

 

●補足

・特定のパソコンのレジストリでキー名 FEATURE_BROWSER_EMULATIONが存在する場合

ホームページビルダーをインストールしたことがある

(一部のバージョンの)Acrobat Readerをインストールしたことがある

 

・期待できること

何もしなければTWebBrowserはIEの 7 として動作します。

自作のTWebBrowserを含むソフトでメモリ違反といった不可解なエラーが”まれに”出ていたのが、前述のレジストリへの値の追加により解消されました。

推測ですが、「自作アプリ内のIE (TWebBrowser)」と「アプリを動かすOSのIE」のバージョンを一致させて動作させることができたのでメモリ違反が発生しなくなった、と思われます。