Webフォームから情報を登録するシステムがあるのですが、
このWebフォームが使い勝手が悪いので、
一旦ソフトに情報を入力し、入力情報にエラーがないかなどの
チェックした後に、Webフォームのおのおのの項目に入力するソフトを
VB2005で作成しました。
しかし、以下の問題が発生しました。
開発言語:VB2005
開発マシン:Win2000 Pro + SP4/WinXP Pro + SP2
動作マシン:開発マシン/WinXP Home + SP2/Vista
ソフトの概要:
左側にWebフォーム表示するためにAxWebBrowserを設置、
右側に情報を入力するためのTextBoxなどのコントロールを設置し、
取得ボタンクリックにより、Webフォームから情報を
右側のコントロールに入力、
入力ボタンクリックにより、右側のコントロールに入力した情報を
左側のWebフォームに入力する動作をします。
問題1:
WinXP Home のみ、AxWebBrowserに表示したWebフォームからの
情報入力/取得の処理中にエラーが発生する。
Dim doc As mshtml.IHTMLDocument = DirectCast(AxWebBrowser.Document, mshtml.IHTMLDocument)
'TextBox1の内容をWebフォームのstrName(Name属性で指定)へ入力の場合
'このコードでエラーが発生
doc.all.item(strName).innertext = TextBox1.Text
'WebフォームのstrName(Name属性で指定)の内容をTextBox1へ入力の場合
'このコードでエラーが発生
TextBox1.Text = doc.all.item(strName).value.ToString
System.Runtime.InteropServices.Marshal.ReleaseComObject(doc)
※エラー発生箇所は、Option Strict On にすると、
遅延バインディングです。実行時の呼び出しに失敗する可能性があります。
と表示されるので、この項目の通知なしにしています。
これも原因になっていると思うのですが、どのように修正すると
このエラーを回避できるでしょうか?
なお、WinXP Home 以外のマシンでは、情報の入力/取得を行っても
エラーは発生せずに、正常に入力/取得できます。
問題2:
Webフォームの登録ボタンをクリックすると、「ページを表示できません。」と表示され、
登録が完了した後の正常なページが表示されません。
たまに、正常なページが表示される場合がありますが、
ほとんど「ページを表示できません。」と表示されます。
ただし、情報の登録自体は正常に行われているので、
致命的な問題ではないのですが、改善方法など何かアドバイスを
頂けたら幸いです。
当方が思うに、タイムアウトとして認識される時間が短くて、
ページを読み込み中にタイムアウトになってしまい上記のエラーが
表示されているのではないかと思ったのですが、
タイムアウトの時間を設定する方法はあるのでしょうか?
もしくは他に原因ありますでしょうか?
問題3:
WinXP Home のみ、strURLに格納されたアドレスを開き、
ページが表示された後に、そのページ内にある指定のリンクを
クリックするという処理を以下のコードで記述しておりますが、
このコードが実行後もAxWebBrowserには何も表示されません。
WinXP Home 以外のマシンでは、以下のコードで正常に動作することを
確認しております。
AxWebBrowser.Navigate(strURL)
'ページが表示されるまで待機
Do While (AxWebBrowser.ReadyState <> WebBrowserReadyState.Complete)
mySleep(50) '50ms待機する自作関数
Loop
Dim doc As mshtml.IHTMLDocument2 = DirectCast(AxWebBrowser.Document, mshtml.IHTMLDocument2)
Dim l As mshtml.IHTMLElementCollection = doc.links
Dim A As mshtml.IHTMLElement = DirectCast(l.item(8), mshtml.IHTMLElement)
A.click()
System.Runtime.InteropServices.Marshal.ReleaseComObject(A)
System.Runtime.InteropServices.Marshal.ReleaseComObject(l)
System.Runtime.InteropServices.Marshal.ReleaseComObject(doc)
各環境には、Microsoft .NET Framework 2.0 はインストール済みであり、
ソフトは、実行ファイル、AxInterop.SHDocVw.dll、Interop.SHDocVw.dllを
同じフォルダに入れ、そこから実行するようにしています。
開発環境ではないVistaのマシンでも正常に動作していることから、
WinXP Home のマシンでは、ランタイムのバージョンが違う、
もしくは不足していることなどの理由により、AxWebBrowser が
正しく動作していないのでしょうか?
何か改善方法やアドバイスなどを頂けたら幸いです。
AxWebbrowserの正体はSHDocVw.dllとAxSHDocVw.dllだったと
思うのでバージョンを確認してみたらどうですか?
.Net Framework2.0のwebbrowserコントロールとは別物ということです。
ヤマ@文系さん、アドバイスありがとうございます。
> AxWebbrowserの正体はSHDocVw.dllとAxSHDocVw.dllだったと
> 思うのでバージョンを確認してみたらどうですか?
てっきり、ビルド先のフォルダの中に入っている
AxInterop.SHDocVw.dllとInterop.SHDocVw.dllが
AxWebbrowserに必要なものかと思っていました。
とりあえず、開発マシンでSHDocVw.dllとAxSHDocVw.dllを検索してみましたら、
SHDocVw.dllは見つかりましたが、AxSHDocVw.dllは見つかりませんでした。
SHDocVw.dllのバージョン確認を行ってみたいと思います。
初回の投稿がかなりの長文になってしまったので、
AxWebbrowserを使用している経緯を書かなかったのですが、
ちょっとここで経緯を説明させていただきます。
最初は、ブラウザ機能を実現するために、
.NET Framework 2.0 の標準のWebBrowserを使用し実現していましたが、
以下の問題がありました。
問題1:
WebBrowser上のフォームで、日本語入力をONにしたあとに、
WebBrowser上のフォームをマウスでクリックすると、
IMEがOFFになってしまいます。なので、マウスでフォームを
クリックしたあとに、再度、日本語入力をONにしなければいけないと
いう手間が発生するようになりました。
ソフト上の別のコントロール(例えば、テキストボックス)で、日本語入力を
ONにしたあとは、WebBrowser上のフォームで、マウスでクリックし直そうが、
日本語入力がONのままになるのですが、どうも、この動きが気になりました。
AxWebbrowserでは、AxWebbrowser上のフォームで日本語入力をONすると、
マウスでクリックし直そうが、日本語入力がONのままだったので、
AxWebbrowserを使用することにしました。
問題2:
ソフトを長時間使用していると、WebBrowser上のフォームでの文字入力の
レスポンスがかなり悪くなるという現象が確認されました。
1文字入力するのに、数十秒経たないと反映されないといった状態です。
どのくらい使用しているとこの現象が発生するのかというのは不明ですが、
vistaのマシンでこの現象を確認しました。
AxWebbrowserを使用することで、この現象が改善されるかどうかは不明ですが、
もしかしたら改善されるかもと思い、AxWebbrowserを使用することにしました。
ただ、ソフトを起動し直すと、文字入力のレスポンスがよくなりますので、
これはコントロールの問題ではなく、メモリリークを起こすようなコーディングを
している可能性はありますでしょうか?
.NET Framework 2.0 の標準のWebBrowserを使用しての
Webフォームからの情報取得、及び、Webフォームへ情報入力は、
全てのマシンで問題なく行えています。
上記の2つの問題が解決できれば、.NET Framework 2.0 の標準のWebBrowserに
切り替えることができるので、上記の2つの問題についても何か
改善方法やアドバイスを頂けたら幸いです。
> 1文字入力するのに、数十秒経たないと反映されないといった状態です。
IME2007 の問題では?
http://salv.miscnotes.com/2007/02/ime2007.php
魔界の仮面弁士さん、アドバイスありがとうございます。
>> 1文字入力するのに、数十秒経たないと反映されないといった状態です。
> IME2007 の問題では?
ただ、IME2007自体の問題であれば、他のソフトを使用中でも起こりそうな感じですが、
このソフトに搭載したWebBrowserで入力のレスポンスが悪くなるようです。
特別、ソフト側で入力の監視をしているわけでもないし、WebBrowserに
ページの表示が完了してしまえば、Webフォーム上に何かを入力しているときは、
完全にソフト側の処理は停止しているはずなんです。
Webフォームからの情報取得、Webフォームへの情報入力を繰り返すことにより、
メモリリークが発生しているのではないかと思ったしだいです。
今日、仮想マシンでいろいろ試してみたら(問題が発生しているマシンは、
違う業務で稼動しているので、あまり動作確認ができないので)、
> 問題1:
> WinXP Home のみ、AxWebBrowserに表示したWebフォームからの
> 情報入力/取得の処理中にエラーが発生する。
の原因わかりました。
Microsoft.mshtml.dllが入っていなかったのが原因でした。
これを入れることにより、エラーも出ずに、取得/入力ともに
問題なく行えるようになりました。
ということで、最初にお伝えしたエラー発生個所は間違いで、
> Dim doc As mshtml.IHTMLDocument = DirectCast(AxWebBrowser.Document, mshtml.IHTMLDocument)
の部分でエラーになっていたようです。
解決にあたり、参考になったページがありましたので、記載しておきます。
http://tdiary.seesaa.net/article/396477.html
また、ヤマ@文系さん、魔界の仮面弁士さん、どうもありがとうございました。
あとは、Webフォームの登録ボタンをクリックすると、
「ページを表示できません。」と表示される問題が解決できればいいのですが、
いまのところ、それほど致命的な問題ではないので、ひとまず、
解決とさせていただきます。
この件について何かアドバイスがありましたら、引き続きレス頂けたら幸いです。
> 問題1:
> WebBrowser上のフォームで、日本語入力をONにしたあとに、
> WebBrowser上のフォームをマウスでクリックすると、
> IMEがOFFになってしまいます。
このへんはIEコンポーネント使用ソフトでけっこうよく起こる動作だったような気がします。
これはSHDocVw.dllでもAxSHDocVw.dllでもターゲットは同じIEコンポーネントですので、あまり改善策にはならないような…
(ついでに、AxSHDocVw.dllは「ある」ものではなく「作る」もののようです。
「AxSHDocVw.dll」で検索すると、作り方→使い方の説明ページがヒットしますよ。)
で、確証はないんですが、個人的にはどうもこの動作は言語バー(IMEバーではありません)の不具合のような気がしています。
試しに、言語バーを使わない設定にして最初のソフトを動作させるとどうなりますか?
私は以前Sleipnirで同じ現象に合い、言語バーを切ってから快適になっています。
さるべーじさん、アドバイスありがとうございます。
> これはSHDocVw.dllでもAxSHDocVw.dllでもターゲットは
> 同じIEコンポーネントですので、あまり改善策にはならないような…
とりあえずは、AxWebbrowserを使用することにより、
AxWebbrowser上の入力エリアで日本語入力をONにし、
再度マウスでクリックし直すと、日本語入力がONままという
意図する動作になったので、良しとしております。
> (ついでに、AxSHDocVw.dllは「ある」ものではなく「作る」もののようです。
> 「AxSHDocVw.dll」で検索すると、作り方→使い方の説明ページがヒットしますよ。)
検索して、説明サイトを参考に、
AxImp.exeにshdocvw.dllをドラッグ&ドロップし、
AxSHDocVw.dllとSHDocVw.dllを作成し、
[ツール]メニュー[ツールボックスアイテムの選択]の
[COMコンポーネント]タブの[参照]ボタンより、
AxSHDocVw.dllを選択したところ、
タイプ ライブラリ AxSHDocVw.tlb を読み込めませんでした。
とエラーが表示され、取り込むことができませんでした。
どのようにしたら取り込めるようになるのでしょうか?
とりあえずは、AxInterop.SHDocVw.dllとInterop.SHDocVw.dllがあれば、
今のところ問題は発生しておりませんが、
AxSHDocVw.dllとSHDocVw.dllを使用するようにした方がよいのでしょうか?
> 試しに、言語バーを使わない設定にして最初のソフトを動作させるとどうなりますか?
すみせん。言語バーを使わない設定するには、どこを設定したらよいのでしょうか?
ツイート | ![]() |