[Delphi]TWebBrowserを含むアプリでエラーの時, IEのバージョンを変えたい時
トップページへ
★本記事の注意点★
・記事の肝心な部分は別サイト様へのリンクです。
・2016年10月投稿時は「レジストリエディタでの編集」のみでしたが、2021年8月にembarcadero様の「プログラムソースで対応が可能」ということが判明したので、記事を改訂しました。
・すべての Delphi(楽天市場で探す ・ amazonで探す) に対応しているとは限りません。
・TWebBrowserで動作するInterernet Explorerのバージョンの変更方法です
*IE自体は「2022/6/16」でサポートが終了しています。
・レジストリを変更します。事前にレジストリのバックアップを強く推奨します。
・この記事およびリンク先の記事を参考にされて発生した、いかなる事象も当方は責任を負うことはできません。実施された方の自己責任で行って下さい。
■概要
- TWebBrowserの概要
- どういった場合に不具合が出るのか?
- なぜ起こるのか?
- 対処法・Internet Explorerのバージョンを変更する
- 謝辞と補足
1.TWebBrowserの概要
自作アプリにブラウザを搭載する場合に便利なコントロールですが、動作させるOSにInternet Explorer (以下、IE)が必須であり、連動していることがわかります。
2.どういった場合に不具合が出るのか?
「TWebBrowserを含むソフト」が、どういったタイミングでエラーが出たり動かなくなる可能性があるのかを推測すると、「ソースを変更していない、リコンパイルしていない実行ファイル」であるにも関わらず
・古いWindows から Win 10に変わった時
・まれかもしれませんが、Internet Explorerのみをアップグレードした時
3.なぜ起こるのか?
TWebBrowserの基本動作および対処法を書かれた方の記事
●WebBrowser コントロールで使われている Internet Explorerを最新のバージョンに変更する
によれば、「TWebBrowserは何も指定をしなければ IE 7 として動作」するそうです。
※サイト様は C# 用の記事として書かれていましたが、Delphi で作成したプログラムにも対応できたので引用させて頂きました。
ここで、私が体験した不具合を説明しますと
Windows 10 + IE11 で自作アプリを動かし、youtube.com を表示したところ、「最新の Adobe Flash Playerをダウンロードして下さいという意味の英文が表示され、動画を再生できない」というものでした。しかしご存知の通り Flash Playerは別途ダウンロード・インストールする必要は通常はありません(編集時)
つまり、自作アプリをWin 10 で動かすと、そのままではTWebBrowserはIE7 として動作。
本来OSがWin 10ならば IEのバージョンは 11 以降なのに、自作アプリ内のブラウザのIEが7 として動作した結果、”最新のFlash Playerのダウンロードが必要”、とyoutubeが警告してきたのではないか?と私は判断しました。
また、Flashの件とは別ですが、同じ自作アプリ内でIEを動かした時にメモリ違反が出ることもありました(詳細は記事の最後にて)。
4.対処法・Internet Explorerのバージョンを変更する
方法が2つあります。TWebBrowserを含むプログラムを配布する場合は(2)をオススメします。
(1) レジストリエディタで直接、値をセットする
前述のサイト様に記載のログオンしているユーザーで正常に動作させる、という意図でレジストリエディタで下記のキーを探します
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
FEATURE_BROWSER_EMULATIONの右クリック→新規→DWORD(32ビット)値を作成します。
・値の名前
TWebBrowserを含む動かしたい自作のソフト名(通常、******.exe)
・値のデータ
その方の記事によれば複数のデータがありますが、TWebBrowserをIEの最終バージョン 11 として動作させるには
10進数で 11001
と指定するそうです。
※IEの他のバージョンや、キー名 FEATURE_BROWSER_EMULATIONが存在しない場合はその方の記事へ
(2) プログラムの実行時にレジストリへ値を書き込む
詳細はembarcadero様サイトをご覧下さい。
ここでは、既存プログラムのソースに加えた部分のみを掲載します。
・uses句に追加
Registry
・private宣言に追加
procedure SetPermissions;
・embarcaderoサイトに記載の下記のソースを、自プログラムにそのままコピペする
{$IFDEF MSWINDOWS} procedure TForm1.SetPermissions; const cHomePath = 'SOFTWARE'; cFeatureBrowserEmulation = 'Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION\'; cIE11 = 11001; var Reg: TRegIniFile; sKey: string; begin sKey := ExtractFileName(ParamStr(0)); Reg := TRegIniFile.Create(cHomePath); try if Reg.OpenKey(cFeatureBrowserEmulation, True) and not(TRegistry(Reg).KeyExists(sKey) and (TRegistry(Reg).ReadInteger(sKey) = cIE11)) then TRegistry(Reg).WriteInteger(sKey, cIE11); finally Reg.Free; end; end; {$ENDIF}
・フォームのOnCreateイベントに次の文を加えます
procedure TForm1.FormCreate(Sender: TObject); begin {$IFDEF MSWINDOWS} SetPermissions; {$ENDIF} end;
実行するとレジストリに自プログラム名(saki_)がセットされました
・レジストリにセットする値を変更すればIEのバージョンを変えられます
embarcadero様サイトでは
cIE11 = 11001;
をセットしていましたが、他の数値を用いることでIEの他のバージョンでエミュレートすることが可能です。
数値についてはマイクロソフトサイトの「Internet Feature Controls (B..C)」の「Browser Emulation」をご覧下さい。英文ですが、数値だけわかれば良いので内容は簡単ですし、IE10やIE9, IE8などにも変更可能です。
個人的には前述の「cIE11」の数値を「11000」or「11001」のどちらかにします。
5.謝辞と補足
以上のように「Delphiで作成したTWebBrowserを含むソフト名と値をレジストリに追加するだけ」で、TWebBrowserを希望のIEのバージョンで動かせることができることが判明しました。
前述の2つのサイト様に、この場ですが謝辞を述べたいと思います。
●補足
・新しいDelphiの場合は「TEdgeBrowser」の使用が一般的だと思います。
TEdgeBrowser コンポーネントの利用と TWebBrowser コンポーネントへの変更点
なお、このリンク先には TWebBrowser メソッド、TWebBrowser プロパティ、TWebBrowser イベントの名称だけですが、一覧で見ることができるので便利です。
Q. この記事を実行する以前にすでにキー名 FEATURE_BROWSER_EMULATIONが存在した場合、考えられることは?
A.
1 ホームページビルダーをインストールしたことがある
2(一部のバージョンの)Acrobat Readerをインストールしたことがある
Q. この記事のレジストリの修正で期待できること
A. 自作のTWebBrowserを含むソフトでメモリ違反といった不可解なエラーが”まれに”出ていたのが、前述のレジストリへの値の追加により解消されました。
推測ですが、「自作アプリ内のIE (TWebBrowser)」と「アプリを動かすOSのIE」のバージョンを一致させて動作させることができたのでメモリ違反が発生しなくなったのではないか?、と思われます。
改めて書きますが、何もしなければTWebBrowserはIEの 7 として動作します。
初版:2016/10/3 11:05