当前位置:编程学习 > C#/ASP.NET >>

Winform 创建窗口句柄时出错

报错处的代码
         frm.MdiParent = this;
          frm.WindowState = FormWindowState.Maximized;
          frm.Show();//出错地点
只是偶尔出错,有时候。

下面是详细的报错信息
未处理 System.OutOfMemoryException
  Message="创建窗口句柄时出错。"
  Source="System.Windows.Forms"
  StackTrace:
       在 System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
       在 System.Windows.Forms.Control.CreateHandle()
       在 System.Windows.Forms.Form.CreateHandle()
       在 System.Windows.Forms.Control.get_Handle()
       在 System.Windows.Forms.Form.SetVisibleCore(Boolean value)
       在 System.Windows.Forms.Control.Show()
       在 Win.frmMain.WinOpen(Form frm) 位置 E:\Visual Studio 2008\Projects\LiveSW\Win\Admin\frmMain.cs:行号 91
       在 Win.frmMain.签单周报_Click(Object sender, EventArgs e) 位置 E:\Visual Studio 2008\Projects\LiveSW\Win\Admin\frmMain.cs:行号 292
       在 DevComponents.DotNetBar.BaseItem.RaiseClick(eEventSource source)
       在 DevComponents.DotNetBar.BaseItem.InternalMouseUp(MouseEventArgs objArg)
       在 DevComponents.DotNetBar.PopupItem.InternalMouseUp(MouseEventArgs objArg)
       在 DevComponents.DotNetBar.ButtonItem.InternalMouseUp(MouseEventArgs objArg)
       在 DevComponents.DotNetBar.MenuPanel.OnMouseUp(MouseEventArgs e)
       在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       在 System.Windows.Forms.Control.WndProc(Message& m)
       在 DevComponents.DotNetBar.MenuPanel.WndProc(Message& m)
       在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       在 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       在 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       在 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       在 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       在 System.Windows.Forms.Application.Run(ApplicationContext context)
       在 Win.Program.Main() 位置 E:\Visual Studio 2008\Projects\LiveSW\Win\Program.cs:行号 31
       在 System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       在 System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.NullReferenceException
       Message="未将对象引用设置到对象的实例。"
       Source="System.Windows.Forms"
       StackTrace:
            在 System.Windows.Forms.NativeWindow.WindowClass.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
            在 System.Windows.Forms.UnsafeNativeMethods.IntCreateWindowEx(Int32 dwExStyle, String lpszClassName, String lpszWindowName, Int32 style, Int32 x, Int32 y, Int32 width, Int32 height, HandleRef hWndParent, HandleRef hMenu, HandleRef hInst, Object pvParam)
            在 System.Windows.Forms.UnsafeNativeMethods.CreateWindowEx(Int32 dwExStyle, String lpszClassName, String lpszWindowName, Int32 style, Int32 x, Int32 y, Int32 width, Int32 height, HandleRef hWndParent, HandleRef hMenu, HandleRef hInst, Object pvParam)
            在 System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
       InnerException: 
位置 E:\Visual Studio 2008\Projects\LiveSW\Win\Program.cs:行号 31
这个地方的代码:
       private static ApplicationContext context;
        [STAThread]
        static void Main()
        {
           Application.EnableVisualStyles();                      
            Application.SetCompatibleTextRenderingDefault(false);   
            frmSplash sp = new frmSplash();                            
            sp.Show();                                                
            context = new ApplicationContext();
           context.Tag = sp;
          Application.Idle += new EventHandler(Application_Idle);  
            Application.Run(context);//这个地方就是详细报错的31行
        }
        //初始化等待处理函数
        private static void Application_Idle(object sender, EventArgs e)
        {
            Application.Idle -= new EventHandler(Application_Idle);
            if (context.MainForm == null)
            {
                frmLogin mw = new frmLogin();
                context.MainForm = mw;
                //mw.Init();                 
                frmSplash sp = (frmSplash)context.Tag;
                sp.Close();                                 
                mw.Show();                                             
              }
        }
请高手指点,只是偶尔出错,另外我用了DotNetBar控件,不是是否有什么影响。
--------------------编程问答-------------------- 只是偶尔出错,什么条件下? --------------------编程问答-------------------- 暂时没有找出规律,点过的页面可能出现,没点过的页面也可能出现。 --------------------编程问答-------------------- UP --------------------编程问答-------------------- frm.MdiParent = this; 
frm.WindowState = FormWindowState.Maximized; 
frm.Show();//出错地点 
===================
frm.MdiParent = this; 
frm.Show();//出错地点 
自己做为自己的MDI父窗口.嵌套了所以导致System.OutOfMemoryException错误.
--------------------编程问答-------------------- 可能有个对象没有实例化吧? --------------------编程问答-------------------- 只是有时出现此问题,我想应该是内存回收造成之前实例化的东西丢失,当然这个只是我的猜测,更不知道改如何解决 --------------------编程问答-------------------- 顶 --------------------编程问答-------------------- 可能和ApplicationContext 有关。没做过。 --------------------编程问答--------------------
引用 8 楼 king19840811 的回复:
可能和ApplicationContext 有关。没做过。

不是这个原因,我将这部分去掉后还是有这种情况
我用了DotNetBar控件,不是是否有影响。 
--------------------编程问答--------------------
引用 8 楼 king19840811 的回复:
可能和ApplicationContext 有关。没做过。

不是这个原因,我将这部分去掉后还是有这种情况
我用了DotNetBar控件,不是是否有影响。 
--------------------编程问答-------------------- 这两天又测试了,找个查询页面查询大数据量的数据,联查几次后,而后随便打开其他任何一个页面,就出现上述问题。但模式窗口不出错。由于一直怀疑DotNetBar控件问题,就模仿一个不适用DotNetBar控件的程序,结果还真的没有出现错误,不知道是模仿不够还是就是DotNetBar控件问题。不知其他使用过DotNetBar控件的朋友是否也遇到过此类情况 --------------------编程问答-------------------- mark --------------------编程问答--------------------
引用 11 楼 livesw 的回复:
这两天又测试了,找个查询页面查询大数据量的数据,联查几次后,而后随便打开其他任何一个页面,就出现上述问题。但模式窗口不出错。由于一直怀疑DotNetBar控件问题,就模仿一个不适用DotNetBar控件的程序,结果还真的没有出现错误,不知道是模仿不够还是就是DotNetBar控件问题。不知其他使用过DotNetBar控件的朋友是否也遇到过此类情况

这应该就是DotNetBar的问题 --------------------编程问答-------------------- 这个应该是dotnetbar控件的问题,我也遇到过!请问你解决了没有? --------------------编程问答-------------------- 请问如何解决?
--------------------编程问答-------------------- 我也遇到这样的情况,请问怎么解决? --------------------编程问答-------------------- 我也遇到这种情况…… --------------------编程问答-------------------- 我也是用dotnetbar出现了这个错误!苦恼啊 --------------------编程问答-------------------- 裁夺 苦苦苦     --------------------编程问答-------------------- 当大量动态生成控件后 就会出这个问题吧  .........句柄用完啦 --------------------编程问答-------------------- 当关闭已打开窗体后用再用frm=null或frm.dispose() --------------------编程问答-------------------- 把占用的资源释放了,再试试看 --------------------编程问答-------------------- 四楼正解 --------------------编程问答-------------------- 没遇到过 --------------------编程问答-------------------- 历时两天发现问题所在,视图中自定义列的别名与真名有相同时,用此视图检索数据后再打开新窗口就会捕获该异常 --------------------编程问答-------------------- 4楼的说法是对的,

我也说说我自己的看法,我以前也出现过。

出现句柄出错的原因有内存溢出可能造成,就是说你运行程序,每次点击一次,程序中没有写释放内存的方法,导致系统内存大量累加,达到一定时候就会出现溢出。结果就会出现句柄错误、。

你看看是不是这个原因造成的, 控件集合有没有clear(); --------------------编程问答-------------------- 遇到相同的问题,也是偶尔出现
http://topic.csdn.net/t/20020913/11/1020251.html
这个LZ解决了,可是没有回复原因和做法  --------------------编程问答-------------------- ........楼主 解决没有啊 --------------------编程问答-------------------- ...求助啊 同样问题 --------------------编程问答-------------------- 如果是用dataGridViewX查询数据出错,dataGridViewX.SuspendLayout();即可 --------------------编程问答-------------------- 我也遇到这样的问题,也是动态生成控件的。还没具体找出原因 --------------------编程问答-------------------- 在主界面加载前用线程调用加载数据
如果没查到数据就没错,查到数据开始初始化窗体就报‘创建窗口句柄时出错。’ --------------------编程问答-------------------- 因为窗体程序是单线程的
但是你的主窗口设置了
ismdicontainer=true
主窗口内没有 对象
--------------------编程问答-------------------- 但是之前是没问题的
今天就出现问题了
而且是有数据的时候报错,没数据就没问题 --------------------编程问答-------------------- load事件里面打断点调 --------------------编程问答-------------------- 如果是偶尔出现错误,那就不会是窗口之间是不是设置子窗口的问题。

如果用了其他的第三发控件,先试着去掉看看有没有影响。

这种偶尔错误的情况,只能慢慢的挨个排查了。一下很难定位。 --------------------编程问答-------------------- 我也遇到这样的错误了!是因为创建为父窗体出现的! --------------------编程问答-------------------- 我也遇到这个问题了
             //追加
                frm.Dispose();
              frm = null;
后解决。
希望对后来者有用

--------------------编程问答-------------------- 这是Winform不稳定的原因.还是用成熟的技术较好,如Delphi,VC++的Mfc
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,