因为当前线程不在单线程单元中,故无法实例化 ActiveX 控件“8856f961-340a-11d0-a96b-00c04fd705a2”

softbunny 2003-12-07 10:26:28
我按孟子E章的一篇文章中说的在程序中加入mshtml控件时很正常,但现在需要在窗体A中按一个按钮,然后弹出一个带MsHtml控件的窗口B,在B窗口中我写的代码如下:

private void btnView_Click(object sender, System.EventArgs e)
{
FrmBrowser bw=new FrmBrowser();
bw.Url="www.163.com";
bw.Show();
}

但是,当一按A窗体中的按钮时就会在B窗体中报错,错误消息为:“因为当前线程不在单线程单元中,故无法实例化 ActiveX 控件“8856f961-340a-11d0-a96b-00c04fd705a2””


报错的地方在窗体B的“InitializeComponent()”中:
private void InitializeComponent()
{
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(FrmBrowser));
this.TxtUrl = new System.Windows.Forms.TextBox();
this.Wbrw = new AxSHDocVw.AxWebBrowser();   //在这一句报错。

测试了一下,如果在窗体A初始化时就生成B的新实例,则不会报错。

但因为我需要在A中打开N个(数量不确定)B的实例,所以不可能在A初始化时就初始化下一堆B的实例(实际运行时可能只需要一个,也可能需要几十个B的实例。

请问我遇到的这个问题该如何解决呢?
...全文
626 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xfreedom 2004-01-11
  • 打赏
  • 举报
回复
收藏
simanh 2003-12-07
  • 打赏
  • 举报
回复
up
softbunny 2003-12-07
  • 打赏
  • 举报
回复
呵呵,谢谢了,这下可真知道了~~高兴~~~
softbunny 2003-12-07
  • 打赏
  • 举报
回复
谢谢了,这次成功了。

不过,我的Main()是在一个单独的.cs文件中的,放在外面不行,放到Main()里面反而可以显示窗体B了,不知道这样做会不会与你说的方法有出入?
haiwangstar 2003-12-07
  • 打赏
  • 举报
回复
是这样:
public static void Main(String[] args)
{
Thread.CurrentThread.ApartmentState = ApartmentState.STA;
Application.Run(...) ...
}

刚才写错了。
haiwangstar 2003-12-07
  • 打赏
  • 举报
回复
Thread.CurrentThread.ApartmentState = ApartmentState.STA;
public static void Main(String[] args)
{
...
}

这样不行吗?
softbunny 2003-12-07
  • 打赏
  • 举报
回复
没有人遇到过吗?
softbunny 2003-12-07
  • 打赏
  • 举报
回复
这一句加到什么地方呀?好象不管用呀~
haiwangstar 2003-12-07
  • 打赏
  • 举报
回复
记住要在实例化COM组件之前设置。一旦创建了,就不能更改了。
haiwangstar 2003-12-07
  • 打赏
  • 举报
回复
你有没有把当前纯种设为单线程模型试试:
.NET中有一个属性是设置COM线程单元模型的,像这样:
Thread.CurrentThread.ApartmentState = ApartmentState.STA;
设为单线程模式。
softbunny 2003-12-07
  • 打赏
  • 举报
回复
谢谢帮我UP

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧