VB6でVista IE7の起動方法は?

解決


Lion  2008-06-18 14:23:12  No: 139924  IP: 192.*.*.*

VB6で下記の様にVista IE7を起動するのですが
『objIE.Busy』のところで下記エラーとなってしまいます。
メッセージ:「リモードサーバがないか、使用できる状態ではありません。」
しかし、そのまま数十秒すると指定のURLが正常に起動されます。
『objIE.Busy』のところでIE7の場合は何か問題があるのでしょうか?
または記述の方法が変わってくるのでしょうか?
IE6などはエラー発生せずに起動されます。
何かご存知の方いらしたら、ご教授ください。

    Dim objIE  As Object

    Set objIE = CreateObject("InternetExplorer.application")  

    objIE.Visible = True

    objIE.Navigate {URL}

    Do While objIE.Busy
  'ビジー間はループ

    Loop

編集 削除
熊谷隆史  2008-06-18 17:09:26  No: 139925  IP: 192.*.*.*

ユーザーアカウント制御 (UAC)を無効にすれば
そのエラーは出なくなるかも知れません。
 (WebBrowserだと関係無いです)

または(UAC有効化なら)、

>     Do While objIE.Busy
> 'ビジー間はループ

>     Loop

多分、この時点で起動時と別プロセスになっています。
ShellWindowsコレクションオブジェクトで
IEを列挙するようにしてください。

編集 削除
Lion  2008-06-18 18:56:02  No: 139926  IP: 192.*.*.*

アドバイスありがとう御座います。
UACは無効にしている状態で行っており
頭を悩ませていたところでした。

「ShellWindows」を使用すると以下のような感じになりますかね?

    Set objShell = CreateObject("Shell.Application")
    '作成された、Windowsコレクションの最後の要素を使用
    Set objIE = objShell.Windows.Item(objShell.Windows.Count - 1)


また、起動したIE画面を最大表示にする場合は、
以下の通りなのでしょうか?(初心者なもので申し訳ありません)
    objIE.FullScreen = True
にするとキャプション部分が画面をはみ出してしまって、普通の
最大画面になるといいのですが。。。

編集 削除
魔界の仮面弁士  2008-06-18 19:43:52  No: 139927  IP: 192.*.*.*

> Set objIE = objShell.Windows.Item(objShell.Windows.Count - 1)
順序が保証されているかどうかは把握していませんが、たぶん、
それで行けるのでは無いでしょうか。(自信無し)

ただ、起動直後のインスタンス取得は、引数なしの
  Set objIE = objShell.Windows.Item
で取得できたかと思います。XP の場合は、ですけど。

# この点において、SDK の説明とは動作が異なっていた記憶が
# あるのだけれども、手元に Vista 環境が無いので確認できず…。


> 起動したIE画面を最大表示にする場合は、
FullScreen だと 意味が異なるので、HWND を使って処理した方が良いかも。

編集 削除
熊谷隆史  2008-06-19 09:41:20  No: 139928  IP: 192.*.*.*

>     objIE.Navigate {URL}

Navigateメソッド呼び出し後、起動元のプロセスは
終了して、別プロセスへとすり替わる仕様だったかと。
この後、
> ShellWindowsコレクションオブジェクトで
IEを取得し直してください。

# DownloadControlを設定出来ないIEはほとんど、使わないのでうろ覚えだったりします。

> また、起動したIE画面を最大表示にする場合は、
> 以下の通りなのでしょうか?(初心者なもので申し訳ありません)
>     objIE.FullScreen = True
> にするとキャプション部分が画面をはみ出してしまって、普通の
> 最大画面になるといいのですが。。。

ShowWindow APIでも使ってください(SW_MAXIMIZE)。
hwndプロパティを指定して。
http://msdn.microsoft.com/ja-jp/library/cc411211.aspx

編集 削除
Lion  2008-06-19 12:02:05  No: 139929  IP: 192.*.*.*

色々なアドバイスありがとう御座います。
早速試してみました。
SellWindowsコレクションの取得ですが、

「Set objIE = objShell.Windows.Item」だと『Do While objIE.Busy』
の部分でエラーがでましたので、従来の
「Set objIE = objShell.Windows.Item(objShell.Windows.Count - 1)」
にしました。

あと最大表示についてですが、皆がおっしゃる通りHWNDを使って
ShowWindowで処理するようにしたところ表示できました。

大変助かりました。ありがとう御座いました。

もう1つ。。。IEを起動できたのは良いのですが、そのIE画面が
IE起動した別画面の後ろに隠れてしまう事が時々発生します。
「Call SetWindowPos(objIE.hwnd, HWND_TOPMOST, 0, 0, 0, 0, 
SWP_NOMOVE + SWP_NOSIZE + SWP_SHOWWINDOW)」
で制御しているのですが、時々後ろに隠れてしまうようです。
確実な方法ってありますでしょうか?ご教授お願い致します。

編集 削除
Lion  2008-06-19 15:15:11  No: 139930  IP: 192.*.*.*

とりあえずIE画面を最前面に表示する事ができました。
お騒がせ致しました。

新たな問題が発生して、Vista-IE7だとIEが2画面開いてしまうので
Navigateした後に「objIE.Quit」、「Set objIE = Nothing」を行い
一旦先に作成したウィンドウをクリアしてから開くようにすると
正常にIE画面が1つ開くようになりました。
しかし、これはVista-IE7に限りのような感じでXP-IE7だと
IE画面が開かないもしくはエラーとなってしまいます。。。
この方法はVista-IE7に限っての記述なのでしょうか?
OSに関係なしにIE6なども共通して使用できるコードとなるのでしょうか?

   Dim objIE  As Object

    Set objIE = CreateObject("InternetExplorer.application")  

    objIE.Visible = True

    objIE.Navigate {URL}

    objIE.Quit                        
    Set objIE = Nothing                 

    Set objShell = CreateObject("Shell.Application")
    Set objIE = objShell.Windows.Item(objShell.Windows.Count - 1)

編集 削除
熊谷隆史  2008-06-19 16:17:02  No: 139931  IP: 192.*.*.*

2008/06/18(水) 17:09:26
での
> ユーザーアカウント制御 (UAC)を無効にすれば
> そのエラーは出なくなるかも知れません。
は間違いでした。

2008/06/19(木) 09:41:20 
> Navigateメソッド呼び出し後、起動元のプロセスは
> 終了して、別プロセスへとすり替わる仕様だったかと。
これも間違いです。
別プロセスで、IEが開かれるでした。


一年前の他サイトの過去ログ(そちらのサイトは3ヶ月しか保存してないので、既に無いです)を
HDDから探して、見たところ、

インターネット オプション
    ↓
セキュリティタブ
    ↓
保護モードを有効にする (Internet Explorer の再開が必要)(&P)
のチェックを外すと、XPと同様になるようです(保護モード無効)。

> OSに関係なしにIE6なども共通して使用できるコードとなるのでしょうか?

別にOSを判定して (GetVersionEx APIや環境変数で)、
それぞれに合わせた処理を行うコーティングをすればいいのではないですか。

編集 削除
スクリプトプログラマ  2008-06-19 19:41:48  No: 139932  IP: 192.*.*.*

Vista環境がないので、未確認ですが、
http://www.vector.co.jp/soft/winnt/net/se439948.html
http://www.vector.co.jp/soft/winnt/util/se440094.html
の方法が使えませんか?

これなら
>もう1つ。。。IEを起動できたのは良いのですが、そのIE画面が
>IE起動した別画面の後ろに隠れてしまう事が時々発生します。
も回避できそうだし。

あと、
>魔界の仮面弁士 2008/06/18(水) 19:43:52 <常連> 
>ただ、起動直後のインスタンス取得は、引数なしの
>  Set objIE = objShell.Windows.Item
>で取得できたかと思います。XP の場合は、ですけど。
が使えるのはIE6までで、IE7からは、「現在のShell」だけになります。

編集 削除
Lion  2008-06-20 10:47:54  No: 139933  IP: 192.*.*.*

インターネット  オプションでの設定でも可能のようですね
早速試してみます。
また丁度、私も「GetVersionEx API」でOSを判定して
各々に合せた起動処理を行うようにしたら良いかと
やってたところでした。
IE画面が後ろに隠れてしまう部分の回避方法もためになりました。
皆さん、色々なアドバイスありがとうございました。
それから凄く勉強になり何とかいけそうです。
頂いたアドバイスを元に色々と試して解決したいと思っております。
本当にありがとう御座いました。

編集 削除