none
Visual Studio 2005里,如何添加SHDocVw? RRS feed

  • 问题

  • 当IE浏览器遇到脚本错误时浏览器,左下角会出现一个黄色图标,点击可以查看脚本错误的详细信息,并不会有弹出的错误信息框。当我们使用WebBrowser控件时有错误信息框弹出,这样程序显的很不友好,而且会让一些自动执行的程序暂停。我看到有人采取的解决方案是做一个窗体杀手程序来关闭弹出的窗体。今天探讨的方法是从控件解决问题。

    1、SHDocVw.dll
    在COM时代我们使用的WebBrowser控件是SHDocVw.dll。屏蔽错误信息的方法很简单使用下面的一句就可以搞定。

    WebBrowser1.Silent = true

    2、.Net中
    在.Net中提供了托管的WebBrowser可供我们使用,当然我们仍然可以在.Net中使用COM组建SHDocVw.dll,如果使用SHDocVw.dll
    处理错误方式和上面的方法一样。但如果我们是使用.Net组件如何解决这个问题呢?

    这个组件给我们提供了一个方法ScriptErrorsSuppressed 。但是在.net framework2.0中他是不起作用的,据说在低版本中使用如下的方式解决

    webBrowser1.ScriptErrorsSuppressed = true(据说在.net framework2.0以前是这样,我没有使用过)

    那么在.net framework2.0中如何解决这个问题呢?

    有一种方法不能彻底解决,可以部分解决问题这里也介绍给大家。

    //捕获控件的错误
     this.WebBrowser.Document.Window.Error += new HtmlElementErrorEventHandler(Window_Error);
    //对错误进行处理
     void Window_Error(object sender, HtmlElementErrorEventArgs e)
            {
                 // 自己的处理代码
                e.Handled = true;
            }

    上面的方法对于多个框架嵌套等等的情形还是不能很好的解决。

    为了彻底解决这个问题,我们借助AxWebBrowser来解决WebBrowser的问题。

    我们定义一个自己的类,他的父类是WebBrowser,以后使用这个类就可以了。在这个类的定义中需要引用SHDocVw。

        class EWebBrowser : System.Windows.Forms.WebBrowser
        
    {
            SHDocVw.IWebBrowser2 Iwb2;

            
    protected override void AttachInterfaces(object nativeActiveXObject)
            
    {
                Iwb2 
    = (SHDocVw.IWebBrowser2)nativeActiveXObject;
                Iwb2.Silent 
    = true;
                
    base.AttachInterfaces(nativeActiveXObject);
            }


            
    protected override void DetachInterfaces()
            
    {
                Iwb2 
    = null;
                
    base.DetachInterfaces();
            }


        }

    从上面的代码可以看出EWebBrowser截取了AxWebBrowser接口,并利用了AxWebBrowser的属性Silent来实现。











    Visual Studiio 2005里,如何添加SHDocVw?我的怎么老说没有添加引用?


    错误 1 找不到类型或命名空间名称“SHDocVw”(是否缺少 using 指令或程序集引用?) 

    另外,这个东西,是不是能在IE 8下使用?


    本人现在使用Windows Server 2003, CentOS Linux 5.2, Windows XP, VirtualBox 2.1.4, Visual Studio 2005, Eclipse 3.2, Microsoft.NET Framework 2.0 SP2, C# 2.0, SQL Server 2000, MySQL 5.0, FireBird 2.1.1, PHP 5.2.4, Office 2007,OpenOffice 3.0和永中Office2009.
    2009年3月30日 10:41

答案

  • 你好!
         工具箱-》右键-》选择项-》点“COM组件”选项卡-》找到"Microsoft Web 浏览器“打上勾-》确定
         用的时候从工具箱拖到界面上,就会自动添加相应的引用了!

         另外,这个文章似乎说的有问题,他说在.NET Framework2.0以前版本设置这个属性是有效的,实际上WebBrowser是.NET Framework2.0才提供的,以前版本没有提供这个控件的:
    而且这个属性在.NET Framework2.0中也是有效的,而且这个属性将隐藏其源自基础 ActiveX 控件的所有对话框,而不仅仅是脚本错误
    周雪峰
    • 已标记为答案 dvdvip 2009年3月30日 12:59
    2009年3月30日 11:45
    版主
  • 这样写:
            private void button1_Click(object sender, System.EventArgs e)
            {
                object o=null;
             this.axWebBrowser1.Navigate(this.textBox1.Text,ref o,ref o,ref o,ref o);      
            }

            private void axWebBrowser1_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
            {
            this.textBox1.Text=(string)e.uRL;
            }
    周雪峰
    • 已标记为答案 dvdvip 2009年3月31日 8:18
    2009年3月31日 6:04
    版主
  • 实际上Navigate的后四个参数是可选的,但是C#不支持可选参数,所以只能传递null
    axWebBrowser1是控件名!
    周雪峰
    • 已标记为答案 dvdvip 2009年3月31日 23:57
    2009年3月31日 8:47
    版主
  • GoBack()从历史记录表回退一个单元,GoForward()从历史记录表前进一个单 元,GoHome() 定位到当前主页面或开始页,Stop()取消正进行的导航请求(包括下载操作)并停止任何动态页面元素(比如背景音乐)、Refresh ()可以刷新页面等等。 ShowSaveAsDialog那个似乎没有
    周雪峰
    • 已标记为答案 dvdvip 2009年4月1日 9:51
    2009年4月1日 8:50
    版主

全部回复

  • 你好!
         工具箱-》右键-》选择项-》点“COM组件”选项卡-》找到"Microsoft Web 浏览器“打上勾-》确定
         用的时候从工具箱拖到界面上,就会自动添加相应的引用了!

         另外,这个文章似乎说的有问题,他说在.NET Framework2.0以前版本设置这个属性是有效的,实际上WebBrowser是.NET Framework2.0才提供的,以前版本没有提供这个控件的:
    而且这个属性在.NET Framework2.0中也是有效的,而且这个属性将隐藏其源自基础 ActiveX 控件的所有对话框,而不仅仅是脚本错误
    周雪峰
    • 已标记为答案 dvdvip 2009年3月30日 12:59
    2009年3月30日 11:45
    版主
  • 谢谢了,现在能引用这个SHDocVw了。但是,还有问题。



    我按它的做法,写了这个EWebBrowser的类。然后,如何把原来的WebBrowser控件的事件和方法,改为这个EWebBrowser类的事件和方法?

    例如:

    private void WebBrowser1_DocumentCompleted(object sender,WebBrowserDocumentCompletedEventArgs e)
    {this.TextBox1.Text=this.WebBrowser1.Url.ToString();}


    private void Button1_Click(object sender,EventArgs e)
    {this.WebBrowser1.Navigate(this.TextBox1.Text);}


    如何修改这两行代码?


    本人现在使用Windows Server 2003, CentOS Linux 5.2, Windows XP, VirtualBox 2.1.4, Visual Studio 2005, Eclipse 3.2, Microsoft.NET Framework 2.0 SP2, C# 2.0, SQL Server 2000, MySQL 5.0, FireBird 2.1.1, PHP 5.2.4, Office 2007,OpenOffice 3.0和永中Office2009.
    2009年3月31日 2:21
  • 这样写:
            private void button1_Click(object sender, System.EventArgs e)
            {
                object o=null;
             this.axWebBrowser1.Navigate(this.textBox1.Text,ref o,ref o,ref o,ref o);      
            }

            private void axWebBrowser1_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
            {
            this.textBox1.Text=(string)e.uRL;
            }
    周雪峰
    • 已标记为答案 dvdvip 2009年3月31日 8:18
    2009年3月31日 6:04
    版主
  • ref o,ref o,ref o,ref 是传递引用吗?怎么这么多个参数?

    axWebBrowser1和IWebBrowser2有什么关系?怎么一下子是1, 一下子又是2?




    本人现在使用Windows Server 2003, CentOS Linux 5.2, Windows XP, VirtualBox 2.1.4, Visual Studio 2005, Eclipse 3.2, Microsoft.NET Framework 2.0 SP2, C# 2.0, SQL Server 2000, MySQL 5.0, FireBird 2.1.1, PHP 5.2.4, Office 2007,OpenOffice 3.0和永中Office2009.
    2009年3月31日 8:21
  • 实际上Navigate的后四个参数是可选的,但是C#不支持可选参数,所以只能传递null
    axWebBrowser1是控件名!
    周雪峰
    • 已标记为答案 dvdvip 2009年3月31日 23:57
    2009年3月31日 8:47
    版主
  • 我现在明白了。这个相当于一个ActiveX控件。这个不是不好,只是它光秃秃的,就有一个Navigate()方法。没有ShowSaveAsDialog(),GoBack(),GoForward(),Stop(),Refresh()方法。

    那么,我怎么控制这个ActiveX控件?


    本人现在使用Windows Server 2003, CentOS Linux 5.2, Windows XP, VirtualBox 2.1.4, Visual Studio 2005, Eclipse 3.2, Microsoft.NET Framework 2.0 SP2, C# 2.0, SQL Server 2000, MySQL 5.0, FireBird 2.1.1, PHP 5.2.4, Office 2007,OpenOffice 3.0和永中Office2009.
    2009年4月1日 0:00
  • class EWebBrowser:WebBrowser
         {
           SHDocVw.IWebBrowser2 Iwb2;

            protected override void AttachInterfaces(object nativeActiveXObject)
           {Iwb2 =(SHDocVw.IWebBrowser2)nativeActiveXObject;
             Iwb2.Silent=true;
             base.AttachInterfaces(nativeActiveXObject);}

           protected override void  DetachInterfaces()
          {Iwb2=null;base.DetachInterfaces();}}

     private void Button1_Click(object sender, System.EventArgs e)
            { EWebBrowser eb=new EWebBrowser();
              eb.Navigate(this.TestBox1.Text);}



    我回去后,是这么实例化这个类的。代码就这么写。不过不能打开网页。不知道是什么原因。这是怎么回事? 网上找到的这段代码是不用的?




    本人现在使用Windows Server 2003, CentOS Linux 5.2, Windows XP, VirtualBox 2.1.4, Visual Studio 2005, Eclipse 3.2, Microsoft.NET Framework 2.0 SP2, C# 2.0, SQL Server 2000, MySQL 5.0, FireBird 2.1.1, PHP 5.2.4, Office 2007,OpenOffice 3.0和永中Office2009.
    2009年4月1日 3:02
  • 你好!
         你说的那些方法这个控件也有对应的方法的!
    周雪峰
    • 已标记为答案 dvdvip 2009年4月1日 8:43
    • 取消答案标记 dvdvip 2009年4月1日 8:43
    2009年4月1日 4:34
    版主
  • 这个axWebBrowser控件,有ShowSaveAsDialog(),GoBack(),GoForward(),Stop(),Refresh()方法吗?VS 2005里上面没有显示出来?是不是要添加什么东西?


    本人现在使用Windows Server 2003, CentOS Linux 5.2, Windows XP, VirtualBox 2.1.4, Visual Studio 2005, Eclipse 3.2, Microsoft.NET Framework 2.0 SP2, C# 2.0, SQL Server 2000, MySQL 5.0, FireBird 2.1.1, PHP 5.2.4, Office 2007, OpenOffice 3.0和永中Office2009.
    2009年4月1日 8:44
  • GoBack()从历史记录表回退一个单元,GoForward()从历史记录表前进一个单 元,GoHome() 定位到当前主页面或开始页,Stop()取消正进行的导航请求(包括下载操作)并停止任何动态页面元素(比如背景音乐)、Refresh ()可以刷新页面等等。 ShowSaveAsDialog那个似乎没有
    周雪峰
    • 已标记为答案 dvdvip 2009年4月1日 9:51
    2009年4月1日 8:50
    版主