TWebBrowserでログインなどが必要なWebサイトを表示し、ログアウトするときにスクリプトで
自動的にウインドウが閉じられるようになっていると、「閉じる」を選択した際
「OLEコントロールのウィンドウハンドルの取得に失敗しました。」と表示され、アプリが
デッドロックされます。
検索してみてJavaScriptのclose()を無効にする方法も採ってみましたが、有効なサイトと
無効なサイトがあるようです。
今のところ検索では解決策が見つからないのですが、何か情報をお持ちの方はいないでしょうか。
簡単な構成で試されましたか?
通常はスクリプトで閉じただけではエラーとなりません。
しかし閉じた時点でTWebBrowserのDocumentプロパティはnilになりますから、
これをどこかで保持していたり、あるいはnilかどうかのチェックを行わずに
何らかの処理を書いていた場合には問題となると思います。
Penny Gさん、ありがとうございます。少し書き間違えていました。
FormにWebBrowserとEditとButtonを一つずつ貼り付け、ButtonEventで
WebBrowser1.Navigate(Edit1.Text);
これで表示されたサイトで件の処理をし、閉じるを選択するとFormに貼り付けたWebBrpwserが
消えます。
この段階でEditコントロールをクリックするとエラーになります。もちろんButton以外には
何のイベントも設定していません。
書き遅れましたが、環境はWinXP+D7+IE8です。
うちの環境でもそのような問題は起こりませんでした。
何か余計なことをやってませんか?
それはともかく、このようにすれば、一応回避はできます。
procedure TForm1.Browser1WindowClosing(Sender: TObject;
IsChildWindow: WordBool; var Cancel: WordBool);
begin
Cancel:=True; // 勝手に閉じられそうになったら閉じるのをやめる。
// 以下、必要に応じてBrowser1をFreeするなりなんなりする。
end;
すんません。
// 以下、必要に応じてBrowser1をFreeするなりなんなりする。
の部分、間違ったことを書いてしまいました。
Browser1のイベントの中でFreeしたらまずいですね。
あ さん、ありがとうございます。
自動生成された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で追加されて
いるのでしたら、乗り換えるのですが。
環境がWinXP+IE8 ならば、SHDocVw.pasかSHDocVw_TLB.pasユニットを再生成すれば、その中にWindowClosingイベントが現れると思うよ。
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)
「""$"!! 」さん、ありがとうございます。
Delphiじゃなく、ActiveX/IEのバージョン違いですね。TWebBrowserは標準でパレットにあるので、
そういう発想が出てきませんでした。
早速Microsoft Internet Controlsのユニットを生成したら、publishedにOnWindowClosingがあります。
イベントさえ取れれば後は何とかなると思いますので、これで解決とさせて頂きます。
皆さんありがとうございました。
あ、入れ違いになりましたね。こちらのActiveXの登録名はMicrosoft Internet Controlsですね。
生成したSHDocVw_TLBは
// PASTLWTR : 1.2
// このファイルは以下のタイプライブラリから 2010/10/22 0:04:16 に生成されました。
// タイプライブラリ: C:\WINDOWS\system32\ieframe.dll (1)
となっています。丁寧にありがとうございました。
ツイート | ![]() |