none
复制和粘贴怎么老出错???4.0版本的 RRS feed

  • 问题

  •  

    我的代码是:

     //richTextBox1.Copy();
                Clipboard.SetDataObject(richTextBox1.SelectedText.Trim(), true);

    信息如下:

     

    有关调用实时(JIT)调试而不是此对话框的详细信息,
    请参见此消息的结尾。

    ************** 异常文本 **************
    System.Runtime.InteropServices.ExternalException (0x800401D0): 所请求的剪贴板操作失败。
       在 System.Windows.Forms.Clipboard.ThrowIfFailed(Int32 hr)
       在 System.Windows.Forms.Clipboard.SetDataObject(Object data, Boolean copy, Int32 retryTimes, Int32 retryDelay)
       在 MyinfoAPP.AddEconomyInfo.toolStripMenuItem2_Click(Object sender, EventArgs e) 位置 D:\My source\MyMobile\MyinfoAPP\MyInfomation\AddEconomyInfo.cs:行号 183
       在 System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
       在 System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
       在 System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
       在 System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
       在 System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
       在 System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
       在 System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
       在 System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)
       在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       在 System.Windows.Forms.Control.WndProc(Message& m)
       在 System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       在 System.Windows.Forms.ToolStrip.WndProc(Message& m)
       在 System.Windows.Forms.ToolStripDropDown.WndProc(Message& m)
       在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


    ************** 已加载的程序集 **************
    mscorlib
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.239 (RTMGDR.030319-2300)
        基本代码: file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
    ----------------------------------------
    MyinfoAPP
        程序集版本: 1.0.0.0
        Win32 版本: 1.0.0.0
        基本代码: file:///D:/My%20source/MyMobile/MyinfoAPP/bin/Release/MyinfoAPP.exe
    ----------------------------------------
    LoginApp
        程序集版本: 1.0.0.0
        Win32 版本: 1.0.0.0
        基本代码: file:///D:/My%20source/MyMobile/MyinfoAPP/bin/Release/LoginApp.DLL
    ----------------------------------------
    System.Windows.Forms
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.235 built by: RTMGDR
        基本代码: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
    ----------------------------------------
    System.Drawing
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.1 built by: RTMRel
        基本代码: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
    ----------------------------------------
    System
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.236 built by: RTMGDR
        基本代码: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
    ----------------------------------------
    System.Configuration
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.1 (RTMRel.030319-0100)
        基本代码: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
    ----------------------------------------
    System.Xml
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.225 built by: RTMGDR
        基本代码: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
    ----------------------------------------
    ErrorFrm
        程序集版本: 1.0.0.0
        Win32 版本: 1.0.0.0
        基本代码: file:///D:/My%20source/MyMobile/MyinfoAPP/bin/Release/ErrorFrm.DLL
    ----------------------------------------
    System.Data
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.1 (RTMRel.030319-0100)
        基本代码: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_32/System.Data/v4.0_4.0.0.0__b77a5c561934e089/System.Data.dll
    ----------------------------------------
    System.Core
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.225 built by: RTMGDR
        基本代码: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
    ----------------------------------------
    System.Transactions
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.1 (RTMRel.030319-0100)
        基本代码: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_32/System.Transactions/v4.0_4.0.0.0__b77a5c561934e089/System.Transactions.dll
    ----------------------------------------
    System.EnterpriseServices
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.1 (RTMRel.030319-0100)
        基本代码: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_32/System.EnterpriseServices/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll
    ----------------------------------------
    mscorlib.resources
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.1 (RTMRel.030319-0100)
        基本代码: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_zh-Hans_b77a5c561934e089/mscorlib.resources.dll
    ----------------------------------------
    CodeMrg
        程序集版本: 1.0.0.0
        Win32 版本: 1.0.0.0
        基本代码: file:///D:/My%20source/MyMobile/MyinfoAPP/bin/Release/MyinfoAPP.exe
    ----------------------------------------
    System.Windows.Forms.resources
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.1 built by: RTMRel
        基本代码: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_zh-Hans_b77a5c561934e089/System.Windows.Forms.resources.dll
    ----------------------------------------
    System.Numerics
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.1 built by: RTMRel
        基本代码: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Numerics/v4.0_4.0.0.0__b77a5c561934e089/System.Numerics.dll
    ----------------------------------------
    CodeMrg
        程序集版本: 1.0.0.0
        Win32 版本: 1.0.0.0
        基本代码: file:///D:/My%20source/MyMobile/MyinfoAPP/bin/Release/MyinfoAPP.exe
    ----------------------------------------
    CardHolder
        程序集版本: 1.0.0.0
        Win32 版本: 1.0.0.0
        基本代码: file:///D:/My%20source/MyMobile/MyinfoAPP/bin/Release/CardHolder.DLL
    ----------------------------------------
    InputNoteBook
        程序集版本: 1.0.0.0
        Win32 版本: 1.0.0.0
        基本代码: file:///D:/My%20source/MyMobile/MyinfoAPP/bin/Release/MyinfoAPP.exe
    ----------------------------------------
    System.Data.SQLite
        程序集版本: 1.0.66.0
        Win32 版本: 1.0.66.0
        基本代码: file:///D:/My%20source/MyMobile/MyinfoAPP/bin/Release/System.Data.SQLite.DLL
    ----------------------------------------
    CodeMrg
        程序集版本: 1.0.0.0
        Win32 版本: 1.0.0.0
        基本代码: file:///D:/My%20source/MyMobile/MyinfoAPP/bin/Release/MyinfoAPP.exe
    ----------------------------------------
    CodeMrg
        程序集版本: 1.0.0.0
        Win32 版本: 1.0.0.0
        基本代码: file:///D:/My%20source/MyMobile/MyinfoAPP/bin/Release/MyinfoAPP.exe
    ----------------------------------------

    ************** JIT 调试 **************
    要启用实时(JIT)调试,
    该应用程序或计算机的 .config 文件(machine.config)的 system.windows.forms 节中必须设置
    jitDebugging 值。
    编译应用程序时还必须启用
    调试。

    例如:

    <configuration>
        <system.windows.forms jitDebugging="true" />
    </configuration>

    启用 JIT 调试后,任何未经处理的异常
    都将被发送到在此计算机上注册的 JIT 调试器,
    而不是由此对话框处理。



    2011年12月27日 6:52

答案

  • 我昨天试了一下,如果我连续执行copy和paste 动作的话,程序就会报System.Runtime.InteropServices.ExternalException (0x800401D0): 剪贴板打开失败的错误。

    首先是SetDataObject2个参数的代码:

    public static void SetDataObject(object data, bool copy)
    {
        SetDataObject(data, copy, 10, 100);
    }
    
     
    
     
    
    

    可以看到还是调用了四个参数的方法,但是多了个10,和100.官方的说明是如果在100毫秒内设置超过10次就会报那个exception。但是事实上我们在使用的时候可能会在连续使用SetDataObject方法时,可能数据的不一致或大或小,会导致在第二次使用的时候就会抛出那样的异常。

    那我们直接使用四个参数的SetDataObject的方法的时候,我们制定第三个和第四个参数的值,合适的话,就应该不会抛出这个异常。

    我尝试了一下这样操作:

     Clipboard.SetDataObject(myBitmap,true,100,1);
    

    也就是1毫秒执行100次的话会抛异常。 但是在我用鼠标连续点击执行该方法的时候,是没问题的。你可以试一下。


    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    2011年12月30日 3:17
    版主

全部回复

  • 你好,根据你所给出的代码,我测试并没有发生任何错误。

    1)我创建了一个WinForm,里边有一个RichTextBox。

    2)放了一个按钮,双击以后直接写入你的代码。

    3)运行程序,在RichTextBox中胡乱输入一些内容,然后选中,点击按钮,一切正常。

    4)补充:另外增加了一个按钮,用于黏贴选中的文本,用于验证。

    5)程序如下:

    namespace WinFormCSharp
    {
        public partial class Form3 : Form
        {
            public Form3()
            {
                InitializeComponent();
            }

            private void button1_Click(object senderEventArgs e)
            {
                //拷贝选中的字符
                Clipboard.Clear();
                Clipboard.SetDataObject(richTextBox1.SelectedTexttrue);
               
            }

            private void button2_Click(object senderEventArgs e)
            {
                var result = Clipboard.GetDataObject();
                DataObject r = (DataObject)result;
                richTextBox1.AppendText(r.GetText());
            }
        }
    }


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月27日 8:55
    版主
  • 很不容易发现的,是我的程序运行很久后,有时候用到这个功能的时候就出现了错误,如复制图片(RichtextBox可以有图片的)后不能粘贴。。。等
    2011年12月27日 16:33
  • 那可能是程序的稳定性的问题。

    出现这个问题是偶尔还是只要用就会报错?


    Lucky Dog
    2011年12月28日 6:53
  • 是偶尔的,代码就一两行,也没有变过。。。就是183行的那一句。不然的话,这个错误我是找不到的。

    System.Runtime.InteropServices.ExternalException (0x800401D0): 所请求的剪贴板操作失败。。。。。

    2011年12月28日 9:21
  • 这段异常是说剪贴板打开失败。 由于是偶尔的,而且我们这里也不能重现。

    建议您在下次异常的时候抓一个Dumps 去看看到底是哪里的问题:

    工具:http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx


    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    2011年12月29日 5:19
    版主
  • 我昨天试了一下,如果我连续执行copy和paste 动作的话,程序就会报System.Runtime.InteropServices.ExternalException (0x800401D0): 剪贴板打开失败的错误。

    首先是SetDataObject2个参数的代码:

    public static void SetDataObject(object data, bool copy)
    {
        SetDataObject(data, copy, 10, 100);
    }
    
     
    
     
    
    

    可以看到还是调用了四个参数的方法,但是多了个10,和100.官方的说明是如果在100毫秒内设置超过10次就会报那个exception。但是事实上我们在使用的时候可能会在连续使用SetDataObject方法时,可能数据的不一致或大或小,会导致在第二次使用的时候就会抛出那样的异常。

    那我们直接使用四个参数的SetDataObject的方法的时候,我们制定第三个和第四个参数的值,合适的话,就应该不会抛出这个异常。

    我尝试了一下这样操作:

     Clipboard.SetDataObject(myBitmap,true,100,1);
    

    也就是1毫秒执行100次的话会抛异常。 但是在我用鼠标连续点击执行该方法的时候,是没问题的。你可以试一下。


    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    2011年12月30日 3:17
    版主
  • 恩。。。谢谢!!我试一下

    新年快乐!

    2012年1月2日 3:31