tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルIE11を新規セッションで2つ起動したい
記事No11495
投稿日: 2015/09/17(Thu) 14:28
投稿者ちゃんにの
お世話になります。
私は超初心者です。

IEで新規セッションで2つ起動し、自動ログインするものを作成したいです。
webbrowserで2つウィンドウを起動して各々ログインはできるのですが、同一セッションになり困っています。
cookieや一時ファイルなどの削除をしても同一セッションになります。

また別の手法で、まず新規セッションでIEを起動させる事はできますが、htmlのエレメントを取得することもできず自動でログインさせることができません。

下記のコードを書いています。

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim objIE As New SHDocVw.InternetExplorer
        Dim obj As Object 'IEオブジェクト参照用
        Dim strURL As String = "hhttps://www.miepro.net/PRO/"

        'On Error Resume Next

        'インターネットエクスプローラーのオブジェクトを作る
        obj = CreateObject("Shell.Application")
        System.Diagnostics.Process.Start("C:\Program Files\Internet   Explorer\iexplore.exe", "-noframemerging" & " " & strURL)
        System.Threading.Thread.Sleep(1000)
        objIE = CType(obj.Windows(obj.Windows.Count - 1), SHDocVw.InternetExplorer)

    End Sub
End Class

デバッグをすると、
objIE = CType(obj.Windows(obj.Windows.Count - 1), SHDocVw.InternetExplorer)
のところでひっかかり、

「型 'System.InvalidCastException' のハンドルされていない例外が WindowsApplication4.exe で発生しました

追加情報:型 'System.__ComObject' の COM オブジェクトをクラス型 'WindowsApplication4.SHDocVw.InternetExplorer' にキャストできません。COM コンポーネントを表す型のインターフェイスを COM コンポーネントを表さない型にキャストすることはできません。ただし、基になる COM コンポーネントがインターフェイスの IID の QueryInterface 呼び出しをサポートする場合は、インターフェイスにキャストすることができます。」

となり先に進めません。

このような初心者でとんちんかんな質問をしているのは重々承知ですが、お知恵をいただけたら幸いです。
よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: IE11を新規セッションで2つ起動したい
記事No11496
投稿日: 2015/09/17(Thu) 17:52
投稿者魔界の仮面弁士
> IEで新規セッションで2つ起動し、自動ログインするものを作成したいです。
IE で Alt キーを押してメニューを表示させ、[ファイル] - [新規セッション] を選択してみてください。
もしくは、InPrivate ブラウズモード(Ctrl + Shift + P)を使うという手もあります。


> obj = CreateObject("Shell.Application")
使いたいのが ShellWindows コレクションなら、最初から {9BA05972-F6A8-11CF-A442-00A0C90A8F39} を
Activator.CreateInstance するのも手です。

> System.Diagnostics.Process.Start("C:\Program Files\Internet   Explorer\iexplore.exe", "-noframemerging" & " " & strURL)
空白の制御が不自然な気がしますが、それはさておき。

今回のケースであれば、Start メソッドの戻り値に対して .MainWindowHandle プロパティで HWND を得て、
そこから子ウィンドウを辿って "Internet Explore_Server" ウィンドウを探していき、
そこに WM_HTML_GETOBJECT を投げることで IHTMLDocument2 を得られるのではないでしょうか。(未確認)


> Dim objIE As New SHDocVw.InternetExplorer
この New は何のために?

…あぁ、なるほど。検索したら下記がヒットしましたが、元ネタはこれですかね?
http://log.windows78.net/2015/05/1350/


> COM コンポーネントを表す型のインターフェイスを COM コンポーネントを表さない型にキャストすることはできません。
ソリューションエクスプローラーにて、[相互運用型の埋め込み]を True から False に変更しておいてください。

[ツリー表示へ]
タイトルRe^2: IE11を新規セッションで2つ起動したい
記事No11497
投稿日: 2015/09/18(Fri) 15:52
投稿者ちゃんにの
魔界の仮面弁士さん
ありがとうございます。色々なサイトを漁っているときに何度もHNを拝見しました。

参考にした元ネタはそこです。私には理解できずコピペで参考にすることができませんでした。
魔界の仮面弁士に頂いたアドバイスはまだ理解できてはいませんが、一つずつ調べて解決してみます。
また質問させて頂くかと思いますが、何卒よろしくお願いいたします。

[ツリー表示へ]
タイトルRe^3: IE11を新規セッションで2つ起動したい
記事No11498
投稿日: 2015/09/24(Thu) 14:18
投稿者魔界の仮面弁士
>>> COM コンポーネントを表す型のインターフェイスを COM コンポーネントを表さない型にキャストすることはできません。
>> ソリューションエクスプローラーにて、[相互運用型の埋め込み]を True から False に変更しておいてください。

VB2010 以降のバージョンを使っている場合、COM オブジェクトをキャストする際に
 『COM コンポーネントを表す型のインターフェイスを
   COM コンポーネントを表さない型にキャストすることはできません』
というエラーが出る場合があります。この場合は、
 (1) ソリューション エクスプローラーで、[全てのファイルを表示]アイコンをクリック
 (2) ソリューション エクスプローラーの[参照設定]の下から、該当アセンブリを選択し、
  プロパティの「相互運用型の埋め込み」を True から False にする。
を試してみてください。


>>> Dim objIE As New SHDocVw.InternetExplorer
>> 元ネタはこれですかね?
>> http://log.windows78.net/2015/05/1350/
> 参考にした元ネタはそこです。

すぐ下で、objIE = CType(obj…) として代入していますので、
事前に New しておく意味はありません。

Dim objIE As New SHDocVw.InternetExplorer
ではなく、
Dim objIE As SHDocVw.InternetExplorer
で十分でしょう。


>>> obj = CreateObject("Shell.Application")
>> 使いたいのが ShellWindows コレクションなら、最初から {9BA05972-F6A8-11CF-A442-00A0C90A8F39} を
>> Activator.CreateInstance するのも手です。

無理に書き換える必要の無い箇所ですが、一応補足しておくと:

今回使用しているのは、obj.Windows なプロパティですが、
これが返すデータ型は SHDocVw.ShellWindows という型です。

ちなみに、obj の本来のデータ型は、Shell32.Shell 型です。


すなわち今回は、「Shell オブジェクトの Windows プロパティから ShellWindows オブジェクトを取得」
していることになるわけですが、「Shell を経由させずに、ShellWindows を直接取得」するために、
 'この変数は、元コードの obj.Windows に相当
 Dim windows As New SHDocVw.ShellWindows()
と記述したり、あるいは参照設定を省いて
 Dim windows As Object = Activator.CreateInstance( _
   Type.GetTypeFromCLSID(Guid.Parse("{9BA05972-F6A8-11CF-A442-00A0C90A8F39}")))
と書くこともできる…という程度の話です。



>> Start メソッドの戻り値に対して .MainWindowHandle プロパティで HWND を得て、
これは要するに、
 Dim p = Process.Start("C:\Program Files\Internet Explorer\iexplore.exe", "-noframemerging " & strURL)
 MsgBox("待機", MsgBoxStyle.SystemModal)
 MsgBox(p.MainWindowHandle, MsgBoxStyle.SystemModal)
ということです。


>> そこから子ウィンドウを辿って "Internet Explore_Server" ウィンドウを探していき、
>> そこに WM_HTML_GETOBJECT を投げることで IHTMLDocument2 を得られるのでは
手順的には、下記の Functoin GetIEDocument() に相当します。
 http://log.windows78.net/2015/06/1404/

上記のままだと、「As EnumChildProc」がエラーになるので、
『Delegate Function EnumChildProc(ByVal hWnd As IntPtr, ByRef lParam As IntPtr) As Boolean』
を追加しておきましょう。

そうすれば、
 Dim doc As Object = GetIEDocument(p.MainWindowHandle)
あるいは
 Dim doc As mshtml.IHTMLDocument2 = GetIEDocument(p.MainWindowHandle)
のようにして、"みえますねっとPRO" のログインページの HTML オブジェクトに
アクセスでき(ると思い)ます。

[ツリー表示へ]