|
分類:[VB.NET/VB2005 以降]
[開発環境]WinXP/VS2005/.NET C#/Framework2.0
はじめまして。
現在、C#で開発を行っており、メイン画面からサブ画面を別スレッドで起動しています。
サブ画面にOpenFileDialogがある場合にダイアログを開こうとすると以下のようなエラーが表示されます。
●エラー内容:
「OLE が呼び出される前に、現在のスレッドが Single Thread Apartment (STA) モードに設定されていなければなりません。
Main 関数に STAThreadAttribute が設定されていることを確認してください。
この例外はデバッガがプロセスにアタッチされている場合にのみ発生します。」
Main関数には、[STAThread]が記述されており、試しにメイン画面にOpenFileDialogを追加してダイアログを開くと
正常にダイアログが表示されます。
サブ画面が別スレッドで起動されているのが原因だと思うのですが、この現象は回避できるのでしょうか?
知っておられる方がおりましたら、ぜひ教えていただけないでしょうか?
よろしくお願いします。
サンプルソースです。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
//
// button1イベント(別スレッドで画面を起動する)
//
private void button1_Click(object sender, EventArgs e)
{
ThreadShowForm();
}
//
// 別スレッドでサブフォームを起動する
//
private void ThreadShowForm()
{
try
{
Thread thread = new Thread(new ParameterizedThreadStart(StartKinouThread));
thread.Start(thread);
}
catch (Exception ex)
{
MessageBox.Show(ex.Source + " :\n " + ex.Message);
}
}
public void StartKinouThread(object thread)
{
try
{
ShowForm();
Thread currentThread = thread as Thread;
// 画面閉じた処理
// スレッド中止
if (currentThread != null)
{
if (currentThread.ThreadState != System.Threading.ThreadState.Aborted)
{
currentThread.Abort();
}
}
}
catch (ThreadAbortException)
{
Thread.ResetAbort();
}
catch (Exception ex)
{
MessageBox.Show(ex.Source + " :\n " + ex.Message);
}
}
//
// サブフォームの起動
//
private void ShowForm()
{
Form2 frm = new Form2();
frm.Text = frm.Handle.ToString();
frm.ShowDialog();
}
//
// メインフォーム側のダイアログ表示(正常に表示される)
//
private void button3_Click(object sender, EventArgs e)
{
this.openFileDialog1.ShowDialog();
MessageBox.Show(this.openFileDialog1.FileName);
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
//
// サブフォーム側のダイアログ表示(エラーになる)
//
private void button2_Click(object sender, EventArgs e)
{
this.openFileDialog1.ShowDialog();
MessageBox.Show(this.openFileDialog1.FileName);
}
}
|