TWebBrowserを含むフォームを64bitコンパイルして動作させるには?

解決


ミルコ  2012-07-30 22:27:42  No: 42673

Delphi XE2でTWebBrowserを含むフォームを64bitコンパイルで実行すると
「0 による浮動小数点数除算」エラーが出てしまいます。。。

32bitコンパイルでは問題ないようなのですが、
回避方法をご存知の方いらっしゃいましたらお教えいただけないでしょうか?

当方の環境:
  Embarcadero RAD Studio XE2 バージョン 16.0.4429.46931(Update 4適用済み)
  Windows 7 Enterprise Edition x64  

//サンプル
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.OleCtrls, SHDocVw;

type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject); begin
  WebBrowser1.Navigate('http://www.google.co.jp');
end;

end.


Mr.XRAY  2012-07-31 00:24:36  No: 42674

こんにちは,Mr.XRAYです.

>回避方法をご存知の方いらっしゃいましたらお教えいただけないでしょうか?

残念ですが,回避方法は知りません.
ただ,これから64bit 版のアプリを開発する方が増えてくるとは思うんです.
そこで,教えて頂きたいのですが,
その開発環境にインストールしている IE (Internet Explorer)のバージョンと,
Flash Player のバージョン.

それと,それらが 32bit 版なのか,64bit 版のどちらなのでしょう.


monaa  2012-07-31 01:12:52  No: 42675

グーグル先生によると色々回避方法があるみたいですが、
私の環境では
uses Math;
procedure TForm1.FormCreate(Sender: TObject);
begin
  Math.SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision]);
  WebBrowser1.Navigate('http://www.google.co.jp');
end;
で回避できました。
http://stackoverflow.com/questions/9472265/how-to-debug-division-by-zero-exception-in-internet-explorer
コピペして動いただけなので、詳細は知りません。

Windows7 64bit, DelphiXE2(64bitコンパイル)
IE9.0.8


monaa  2012-07-31 01:16:42  No: 42676

あぁ…単に例外無視してるだけですね。
気持ちのよい解決策では無いみたいです。


Mr.XRAY  2012-07-31 21:09:57  No: 42677

こんにちは,Mr.XRAYです.

>あぁ…単に例外無視してるだけですね。
>気持ちのよい解決策では無いみたいです。

そんなことないと思いますよー.
数値計算ではないし,32 bit 版のアプリでは,Set8087CW が使えましたが,
64 bit の浮動小数点演算エラーは回避できないので,代わりの関数が SetExceptionMask
ですから.

[System.Math.SetExceptionMask]
http://docwiki.embarcadero.com/Libraries/ja/System.Math.SetExceptionMask

[System.Set8087CW]
http://docwiki.embarcadero.com/Libraries/ja/System.Set8087CW

64 bit 版の IE (64 bit 版の DLL)ではどうなるか知りたいんですよね.
自分でやることもできますが,もしも質問された方が...


ジェロム  2012-07-31 23:43:12  No: 42678

>Mr.XRAYさん
何か勘違いされていると思うのですが、
32bitと64bitは同一プロセスで混在させることはできません。
アウトプロセスのCOMであれば、COMの形を取った単なるプロセス間通信になるので、
32bitと64bitの混在は可能ですが、WebBrowserコントロールはそうではありません。
従って64bitでコンパイルしていると書いてある以上、聞くまでもなく64bitとなります。


Mr.XRAY  2012-08-01 00:46:22  No: 42679

>従って64bitでコンパイルしていると書いてある以上、聞くまでもなく64bitとなります。

ハハハッ.そりゃそうですね.
インストールされている IE が 32 bit 版でも 64bit 版でも関係ないですね.
IE の Adin 関係で 64 bit 版では動作しないのがあるので,そういのは関係しないのか
知りたかったのですか.


Mr.XRAY  2012-08-01 00:58:42  No: 42680

>知りたかったのですか.

....「が」ですね.


ミルコ  2012-08-01 04:31:27  No: 42681

返信が遅くなってしまいスミマセン。。。

>Mr.XRAYさん
IEとFlash Playerのバージョンは
  IE: 9.0.8112.16421
  Flash Player: 11.3.300.265
です。

IEは32bitと64bit両方がインストールされています。
Flash Playerは・・・正直よくわからないのですが、

[Flash Player の 64 ビット対応について]
http://kb2.adobe.com/jp/cps/230/230463.html

を見る限り、32bitと64bitの両方がインストールされているのでは、と思います。

>monaaさん
検索能力が低く、面目ないです。。。
ご提示いただきましたMath.SetExceptionMaskで回避可能であることを
当方のプログラムでも確認しました。

ひとまず回避できるということが分かりましたので、
(他にも検証すべき項目がありますので)一旦解決とさせていただきます。

皆様、ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加