[Delphi]TWebBrowserを含むアプリでエラーの時, IEのバージョンを変えたい時






トップページへ

★本記事の注意点★

・記事の肝心な部分は別サイト様へのリンクです。

・2016年10月投稿時は「レジストリエディタでの編集」のみでしたが、2021年8月にembarcadero様の「プログラムソースで対応が可能」ということが判明したので、記事を改訂しました。

・すべての Delphi(楽天市場で探すamazonで探す) に対応しているとは限りません。

・TWebBrowserで動作するInterernet Explorerのバージョンの変更方法です

*IE自体は「2022/6/16」でサポートが終了しています。

・レジストリを変更します。事前にレジストリのバックアップを強く推奨します。

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


■概要

  1. TWebBrowserの概要
  2. どういった場合に不具合が出るのか?
  3. なぜ起こるのか?
  4. 対処法・Internet Explorerのバージョンを変更する
  5. 謝辞と補足

 

1.TWebBrowserの概要

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

 

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

「TWebBrowserを含むソフト」が、どういったタイミングでエラーが出たり動かなくなる可能性があるのかを推測すると、「ソースを変更していない、リコンパイルしていない実行ファイル」であるにも関わらず

・古いWindows から Win 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 として動作」するそうです。

※サイト様は 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






関連記事
[Delphi]System.PWideCharの記述例・備忘録

[Delphi]DayOfWeekなど日付から曜日を表示

[Delphi] IncDay・IncHour 日付や時刻の加算減算

[Delphi]DaysBetween・HoursBetween日付や時刻の間隔を知る

[Delphi]文字列の暗黙的なキャスト警告を消す方法