На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Выскакивает ошибка при закрытии приложен
    Привет всем.
    Есть простейшее windows приложение.
    Проблемма в том, что когда пытаюсь его закрыть программно выскакивает вываливается с ошибкой.
    Пытаюсь вот так.
    ExpandedWrap disabled
      Close();
      //или так
      Application.Terminate();
      //или так
      Process.GetCurentProcess().Kill();

    Вот с чем вываливается.
    user posted image

    Что его не устраивает?
    Спасибо.
      А debug что говорит?
        ExpandedWrap disabled
          Application.Exit();
          Выделяет эту строчку.
          ExpandedWrap disabled
            Application.Run(new Form1());

          ObjectDisposedException was unhandled
          Cannot access a disposed object.
          Object name: 'Form1'.
            newline, по идее там есть кнопочка copy exception details...скопируй сюда, чего она говорит.
              А зачем так жестоко-то, Kill сразу?
              Пробуй что MIF сказал, либо
              ExpandedWrap disabled
                Application.ExitThread();
                wdk, да он же говорит - даже Close () вылетает...
                кстати вот убойный совет: попробуй отослать отчёт мелкомягким :lol: :lool:
                  Цитата newline @
                  ObjectDisposedException was unhandled
                  Cannot access a disposed object.
                  Object name: 'Form1'.

                  Посмотри выше по коду где убивается Form1. Там и есть проблема
                    ObjectDisposedException was unhandled
                    Cannot access a disposed object.
                    Object name: 'Form1'.

                    Тут говорится о том , что произошла ошибка при удалении объекта.
                    Нельзя получить доступ к удалённому объекту (Form1).

                    Я бы проверил с помощью обработки искл. ситуаций :

                    try{

                    Application.Run(new Form1());

                    }
                    catch(ObjectDisposedException err)
                    {
                    MessageBox.Show(err.Message);
                    }

                    Узнал бы где ошибка и нажал F1. MSDN всё скажет!!!
                      PMAXIM, :no: я вот ради прикола попробовал убить...managed способом что-то не получается
                        Цитата archimed7592 @
                        вот ради прикола попробовал убить...managed способом что-то не получается

                        Убить что?
                        у формы метод Dispose вызвать не получается?
                          PMAXIM, получается, только форма закрывается и приложение завершается без ошибки. если поставить какой-нить контрол на форму и сделать control.Dispose (), то он исчезнет с формы :) а дальше всё будет работать и нормально закроется.
                            Что то я не понял, нормально закрывается или такую же ошибку выдает приложение?
                              archimed7592 (OВот что там пишется.
                              System.ObjectDisposedException was unhandled
                              Message="Cannot access a disposed object.\r\nObject name: 'Form1'."
                              Source="System.Windows.Forms"
                              ObjectName="Form1"
                              StackTrace:
                              at System.Windows.Forms.Control.CreateHandle()
                              at System.Windows.Forms.Form.CreateHandle()
                              at System.Windows.Forms.Control.get_Handle()
                              at System.Windows.Forms.Control.SetVisibleCore(Boolean value)
                              at System.Windows.Forms.Form.SetVisibleCore(Boolean value)
                              at System.Windows.Forms.Control.set_Visible(Boolean value)
                              at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
                              at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
                              at System.Windows.Forms.Application.Run(Form mainForm)
                              at WindowsApplication1.Program.Main() in F:\services\WindowsApplication1\WindowsApplication1\Program.cs:line 17
                                Выложи код в архиве, посмотрим что там!
                                  form.Dispose () -> форма закрывается, если это главная форма, то программа завершается без ошибки.
                                  control.Dispose () -> контрол исчезает с формы, можно далее работать с формой. при закрытии программы ошибки не выдает.
                                    Остается выяснить что у нас на строке 17... Но походу трабла в попытке доступа к уже освобожденному объекту Form1
                                      newline, с хэндлами в программе работаешь? небось через winapi\interop? показывай где и как...
                                        newline ты после выхода никакой контрол на форму бросать не пытаешься случайно? или еще что нибудь с формой сделать?
                                          Цитата Viper @
                                          Остается выяснить что у нас на строке 17
                                          Цитата newline @
                                          Application.Run(new Form1());


                                          Добавлено
                                          PMAXIM, после выхода это где к примеру? все финалайзеры\деструкторы\события связанные с формой происходят до dispose'а (или во время его выполнения).
                                            Цитата archimed7592 @
                                            Цитата Viper @
                                            Остается выяснить что у нас на строке 17
                                            Цитата newline @
                                            Application.Run(new Form1());

                                            Тогда получается, что после закрытия приложения вызывается Application.Run()?
                                            Странно это

                                            Добавлено
                                            archimed7592 После сроки Close()||Exit||Kill().
                                              Вот код приложения
                                              ExpandedWrap disabled
                                                public Form1()
                                                        {
                                                            InitializeComponent();
                                                            Form2 LogDialog=new Form2(); // получается 17 строкой
                                                            if (LogDialog.ShowDialog(this) != DialogResult.OK)
                                                            {
                                                                MessageBox.Show("Логин или пароль указаны не верно!\nПриложение будет закрыто");
                                                                Close();
                                                            }
                                                        }
                                                newline, не знаю как тебе это удаётся...у меня даже
                                                ExpandedWrap disabled
                                                          private void Form1_Load(object sender, EventArgs e)
                                                          {
                                                              try
                                                              {
                                                                  Close();
                                                              }
                                                              finally
                                                              {
                                                                  Controls.Add(new Button());
                                                              }
                                                          }
                                                не ругается
                                                  newlineперенеси код проверки пароля или что у тебя там, из конструктора Form1, в main(), либо создавай его в Form1_Load, как у Archimed7592, а то выходит ты в конструкторе уже разрушаешь объет, который в нем должен быть создан
                                                    ага, а я и не заметил, что я не в конструкторе балуюсь :wall:
                                                    да, действительно...ошипка имеет место быть...ну вот и решение - юзай form_load
                                                      Цитата archimed7592 @
                                                      ага, а я и не заметил, что я не в конструкторе балуюсь

                                                      Я тоже не в кострукторе проверял
                                                        Ваша правда Twilight.
                                                        Спасибо большое всем.
                                                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                        0 пользователей:


                                                        Рейтинг@Mail.ru
                                                        [ Script execution time: 0,0487 ]   [ 16 queries used ]   [ Generated: 6.08.25, 13:40 GMT ]