none
ShowDialog时内存错误 RRS feed

  • 问题

  • 一段简单的代码,整出个内存错误

                foreach (ListViewItem item in items)
                {
                    FileListViewItem fItem = item as FileListViewItem;
                    MailAttachmentData data = mDataManager.GetAttachment(mMail.GUID, fItem.ID);
                    
                    dialog.Title = "保存附件";
                    dialog.FileName = data.FileName;
                    string myFileName = dialog.FileName;
                    if (dialog.ShowDialog() == DialogResult.OK)
                    {
                        data.Save(myFileName);
                    }                
                }

    用户代码未处理 System.AccessViolationException
      Message="尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"
      Source="System.Windows.Forms"
      StackTrace:
           在 System.Windows.Forms.UnsafeNativeMethods.GetSaveFileName(OPENFILENAME_I ofn)
           在 System.Windows.Forms.SaveFileDialog.RunFileDialog(OPENFILENAME_I ofn)
           在 System.Windows.Forms.FileDialog.RunDialogOld(IntPtr hWndOwner)
           在 System.Windows.Forms.FileDialog.RunDialog(IntPtr hWndOwner)
           在 System.Windows.Forms.CommonDialog.ShowDialog(IWin32Window owner)
           在 System.Windows.Forms.CommonDialog.ShowDialog()
           在 EnterpriseMail.AttachmentBrowser.mnuSaveAttachment_Click(Object sender, EventArgs e) 位置 D:\Work\mail\EnterpriseMail2008\AttachmentBrowser.cs:行号 133
           在 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)
      InnerException:

    2012年4月6日 7:04

答案

  • 前几天找出原因了,最近比较忙没有到论坛进行回复,不好意思。

    原因很简单:在ShowDialog时找不到 模态窗体的父窗体了。我们自定义了一个容器控件,然后里面又套了一个容器控件。把容器的窗口句柄传过来就OK了:  dlg.ShowDialog(frmXXX) 就OK了。

    • 已标记为答案 stoneca 2012年4月11日 13:19
    2012年4月11日 13:19

全部回复

  • Hi stoneca,

    欢迎来到C#论坛。

    根据你目前的代码我们无法重现这些错误,可以为我们提供更为详细的代码吗?此外,你可以试试将RestoreDirectory的值设为true(dialog.RestoreDirectory = true;)。

    祝你愉快。


    Bob Shen [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月9日 8:18
    版主
  • 前几天找出原因了,最近比较忙没有到论坛进行回复,不好意思。

    原因很简单:在ShowDialog时找不到 模态窗体的父窗体了。我们自定义了一个容器控件,然后里面又套了一个容器控件。把容器的窗口句柄传过来就OK了:  dlg.ShowDialog(frmXXX) 就OK了。

    • 已标记为答案 stoneca 2012年4月11日 13:19
    2012年4月11日 13:19