C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 生成したスレッドからのIE操作でエラーが発生してしまいます。


(過去ログ 48 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■26218 / inTopicNo.1)  生成したスレッドからのIE操作でエラーが発生してしまいます。
  
□投稿者/ 次郎 (1回)-(2008/10/04(Sat) 00:32:19)

分類:[C#] 

開発言語 C# (Visual Studio2005)

はじめまして、次郎と申します。
現在、起動済みのIEを取得して
ページの移動後にスクロールする
プログラムを作成しております。

そこら中を漁って下記のコードまでは行き着いたのですが
ページが表示されるまで待たないように処理をスレッド化した所

指定されたキャストは有効ではありません

となってしまいます。
原因もさっぱりわからず参っています。。。
どなたか対策をご教授頂けないでしょうか。

宜しくお願い致します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
//参照設定
//Microsoft Internet Controls [バージョン:1.1.0.0]
//Microsoft.mshtml            [バージョン:7.0.3300.0 (ランタイムのバージョンv1.0.3705)]

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        private static SHDocVw.InternetExplorer m_IE;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.getIE();
            
            this.myNavigate("http://www.yahoo.co.jp/");

            //スレッドを生成せずに呼ぶと成功する。
            //safeNavi("http://www.yahoo.co.jp/");

        }
       
        //起動されているIEを取得する
        private void getIE()
        {
            string objName;
            SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindowsClass();

            foreach (SHDocVw.InternetExplorer ie in shellWindows)
            {
                objName = System.IO.Path.GetFileNameWithoutExtension(ie.FullName).ToLower();

                if (objName.Equals("iexplore"))
                {
                    m_IE = ie;
                }
            }
        }
	
        //スレッドを生成して safeNaviメソッドを呼ぶだけ
        public void myNavigate(string url)
        {

            System.Threading.Thread navigateWaitThread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(Form1.safeNavi));
		    navigateWaitThread.Start(url);
    		
	   return;
        }

        //移動後、スクロールまで実施する
        private static void safeNavi(object url)
        {
            object dummy = System.Type.Missing;
            mshtml.DispHTMLDocument myDocument = null;
            mshtml.DispHTMLWindow2 myWindow = null;

            lock (m_IE)
            {
                m_IE.Navigate((string)url, ref dummy, ref dummy, ref dummy, ref dummy);
                m_IE.Visible = true;
            }

            while (m_IE.Busy)
            {
                System.Threading.Thread.Sleep(500);
            }
            
            
            myDocument = (mshtml.DispHTMLDocument)m_IE.Document;
            myWindow = (mshtml.DispHTMLWindow2)myDocument.parentWindow; //<-{"指定されたキャストは有効ではありません。"}
            
            //スクロールを実施            
            myWindow.scrollTo(0, 100);

            return;
        }
    }
}

引用返信 編集キー/
■26221 / inTopicNo.2)  Re[1]: 生成したスレッドからのIE操作でエラーが発生してしまいます。
□投稿者/ NyaRuRu (67回)-(2008/10/04(Sat) 01:09:15)
No26218 (次郎 さん) に返信
> そこら中を漁って下記のコードまでは行き着いたのですが
> ページが表示されるまで待たないように処理をスレッド化した所
>
> 指定されたキャストは有効ではありません
>
> となってしまいます。
> 原因もさっぱりわからず参っています。。。
> どなたか対策をご教授頂けないでしょうか。

スレッドのアパートメントモデルを STA にすると改善されることがあります。
http://msdn.microsoft.com/ja-jp/library/system.threading.thread.setapartmentstate.aspx

「指定されたキャストは有効ではありません」というエラーから、アパートメントモデルの問題とは断定できないのですが、アパートメントモデルの不一致は意外な形で他の場所に例外を引き起こすことがあり、注意が必要です。
引用返信 編集キー/
■26222 / inTopicNo.3)  Re[2]: 生成したスレッドからのIE操作でエラーが発生してしまいます。
□投稿者/ 次郎 (2回)-(2008/10/04(Sat) 02:33:55)
NyaRuRu さん

早速のアドバイスありがとうございます。
NyaRuRuさんのおっしゃる通り
スレッドのアパートメントモデルを STA にした所

無事できました!!

実は2週間くらい悩んでいたのですがやっとゆっくり寝れそうです。
スレッドのアパートメントモデルというのは初めて知りました。
本当にありがとうございました。

解決済み
引用返信 編集キー/
■26225 / inTopicNo.4)  Re[3]: 生成したスレッドからのIE操作でエラーが発生してしまいます。
□投稿者/ やじゅ (677回)-(2008/10/04(Sat) 11:41:39)
やじゅ さんの Web サイト
No26222 (次郎 さん) に返信
> スレッドのアパートメントモデルを STA

今後のために単純に補足事項として記述

System.Windows.Forms.WebBrowser

WebBrowser クラスは、シングル スレッド アパートメント (STA: Single Thread Apartment) モードに
設定されているスレッドでだけ使用できます。
このクラスを使用するには、Main メソッドが確実に STAThreadAttribute 属性でマークされているようにします。
http://www.kdevelopmentsite.org/csharp/app/sitemapeditor/exp/html.htm
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -