[TWebBrowser] Scriptで閉じるとエラーになる

解決


Kenny  2010-10-21 00:47:35  No: 39399

TWebBrowserでログインなどが必要なWebサイトを表示し、ログアウトするときにスクリプトで
自動的にウインドウが閉じられるようになっていると、「閉じる」を選択した際
「OLEコントロールのウィンドウハンドルの取得に失敗しました。」と表示され、アプリが
デッドロックされます。
検索してみてJavaScriptのclose()を無効にする方法も採ってみましたが、有効なサイトと
無効なサイトがあるようです。
今のところ検索では解決策が見つからないのですが、何か情報をお持ちの方はいないでしょうか。


Penny G  2010-10-21 01:37:11  No: 39400

簡単な構成で試されましたか?
通常はスクリプトで閉じただけではエラーとなりません。

しかし閉じた時点でTWebBrowserのDocumentプロパティはnilになりますから、
これをどこかで保持していたり、あるいはnilかどうかのチェックを行わずに
何らかの処理を書いていた場合には問題となると思います。


Kenny  2010-10-21 02:32:55  No: 39401

Penny Gさん、ありがとうございます。少し書き間違えていました。

FormにWebBrowserとEditとButtonを一つずつ貼り付け、ButtonEventで

  WebBrowser1.Navigate(Edit1.Text);

これで表示されたサイトで件の処理をし、閉じるを選択するとFormに貼り付けたWebBrpwserが
消えます。
この段階でEditコントロールをクリックするとエラーになります。もちろんButton以外には
何のイベントも設定していません。

書き遅れましたが、環境はWinXP+D7+IE8です。


  2010-10-22 07:09:46  No: 39402

うちの環境でもそのような問題は起こりませんでした。
何か余計なことをやってませんか?

それはともかく、このようにすれば、一応回避はできます。

procedure TForm1.Browser1WindowClosing(Sender: TObject;
  IsChildWindow: WordBool; var Cancel: WordBool);
begin
  Cancel:=True; // 勝手に閉じられそうになったら閉じるのをやめる。
  // 以下、必要に応じてBrowser1をFreeするなりなんなりする。
end;


  2010-10-22 07:14:55  No: 39403

すんません。
// 以下、必要に応じてBrowser1をFreeするなりなんなりする。
の部分、間違ったことを書いてしまいました。
Browser1のイベントの中でFreeしたらまずいですね。


Kenny  2010-10-22 08:35:29  No: 39404

あ さん、ありがとうございます。
自動生成されたUnitに自力で追加したのは
procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate(Edit1.Text);
end;
initialization
  OleInitialize(nil);
finalization
  OleUninitialize;
これだけです。
また、こちらの環境ではWindowClosingというイベントがないのです。バージョンが違うのでしょうか。
SHDocVw.Pasのタイムスタンプは2002年9月6日、16:00:00で、ソースの先頭は
// PASTLWTR : 1.1
// File generated on 7/26/99 12:22:56 PM from Type Library described below.
となっています。
ソース中にもWindowClosingの文字が見あたりません。D8は持っていますので、D8で追加されて
いるのでしたら、乗り換えるのですが。


D8でなくても  2010-10-22 08:54:05  No: 39405

環境がWinXP+IE8 ならば、SHDocVw.pasかSHDocVw_TLB.pasユニットを再生成すれば、その中にWindowClosingイベントが現れると思うよ。


タイプライブラリの取り込み  2010-10-22 09:12:02  No: 39406

Microsoft Browser Helpers (IEFrame.dll)からタイプライブラリユニット(SHDocVw_TLB.pas)を生成すると、その中にOnWindowClosingイベントがある。

// PASTLWTR : $Revision:  1.130.1.0.1.0.1.6  $
// このファイルは以下のタイプライブラリから 2010/10/21 23:49:31 に生成されました。

// Type Lib: D:\WINDOWS\system32\ieframe.dll (1)


Kenny  2010-10-22 09:19:07  No: 39407

「""$"!! 」さん、ありがとうございます。
Delphiじゃなく、ActiveX/IEのバージョン違いですね。TWebBrowserは標準でパレットにあるので、
そういう発想が出てきませんでした。

早速Microsoft Internet Controlsのユニットを生成したら、publishedにOnWindowClosingがあります。
イベントさえ取れれば後は何とかなると思いますので、これで解決とさせて頂きます。
皆さんありがとうございました。


Kenny  2010-10-22 09:25:01  No: 39408

あ、入れ違いになりましたね。こちらのActiveXの登録名はMicrosoft Internet Controlsですね。
生成したSHDocVw_TLBは

// PASTLWTR : 1.2
// このファイルは以下のタイプライブラリから 2010/10/22 0:04:16 に生成されました。
// タイプライブラリ: C:\WINDOWS\system32\ieframe.dll (1)
となっています。丁寧にありがとうございました。


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

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






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