Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка с процессами. Ошибка с процессами. 
:(
    Опции темы
eon
Дата 21.10.2010, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 31.8.2010

Репутация: нет
Всего: нет



Есть код, открывающий файл из базы данных:

Код

filename = "~tmp" + dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["filenameDataGridViewTextBoxColumn"].Value as string;
            try
            {
                SqlConnection cn = new SqlConnection(ConnectionString);
                SqlCommand cmd = new SqlCommand("USE requests; SELECT fil FROM files WHERE (id = " + dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["idDataGridViewTextBoxColumn"].Value + ")", cn);
                {
                    try
                    {
                        cn.Open();
                        SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                        FileStream fs = new FileStream(filename,  FileMode.Create, FileAccess.Write);
                        //File.SetAttributes(filename, FileAttributes.Hidden);
                        if (dr.Read())
                        {
                            byte[] b = new byte[(dr.GetBytes(0, 0, null, 0, int.MaxValue))];
                            dr.GetBytes(0, 0, b, 0, b.Length);
                            fs.Write(b, 0, b.Length);
                        }
                        fs.Close();
                    }
                    catch (SqlException ex)
                    {
                        MessageBox.Show(ex.Message, "Ошибка");
                    }
                }
            }
            catch (NullReferenceException ex)
            {
                MessageBox.Show(ex.Message);
            }
            Process prc = null;
            string output = string.Empty;
            try
            {
                prc = new Process();
                prc.StartInfo.FileName = filename;
                prc.Start();
                prc.WaitForExit();
            }
            finally
            {
                if (prc != null)
                {
                    prc.Close();
                    File.Delete(filename);
                }
            }


Всё работает хорошо, будь то файл-картинка или doc. или xls.
НО возникла проблема: если запущен Microsoft Word например, то при попытке выполнения вышеуказанного кода, вылетает ошибка на строке:

Код

prc.WaitForExit();


Ошибка: Нет процессов, связанных с этим объектом.

Хотя файл он открывает, а при попытке ожидания выдает, что нет процесса.
Повторяю, это возникает, если запущен Word. Если word не запущен, файл открывается и после закрытия Word'a удаляется без проблем.

В чем проблема?
PM MAIL   Вверх
Мурлыкатам_
Дата 21.10.2010, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

Репутация: нет
Всего: 2



 
Код
prc.WaitForExit();


Можно заменить на
 
Код

while(prc.IsResponding()) { // Могу ошибиться в названии метода, но суть ясна
      Application.DoEvents(); // Кажется ток для вин формс работает, в консольной приладе можноа заменить на тред.слип если продолжение выполнение консоли не принципиально.
}

 
Код

(id = " + dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["idDataGridViewTextBoxColumn"].Value + ")"

А зачем здесь скобки? 
Можно же просто написать where id = какое-то значение. Кстати разумно было бы  dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["idDataGridViewTextBoxColumn"].Value предварительно проверить на допустимость содержимого.
 
Код

cn.Open();
 - открыт, но далее по коду не закрыт. Не уверен на 100% что скл ридер нун закрывать, не помню, но что-то мне подсказывает, что ридер тоже нун закрывать. Для этих целей, все что можно запихать в using лучше запихивать.

Перед выполнением этой команды: WaitForExit(); можно проверить запущен ли ворд, с помощью класса Process - взять все запущенные процессы, найти все ворды, а затем безжалостно убить smile

Также может быть трабла в создании процесса, там есть параметр myProcessStartInfo.UseShellExecute = false; можно попробывать поставить в тру и посмотреть что будет. Если я правильно помню, 
то результатом будет запуск файла, как из командной строки и возможно создастся новый экземпляр ворда для этого файла.

Замена на  Application.DoEvents(); - реальная альтернатива, с моей точки зрения smile
 

Это сообщение отредактировал(а) Мурлыкатам_ - 21.10.2010, 14:56


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
eon
Дата 22.10.2010, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 31.8.2010

Репутация: нет
Всего: нет



Получается так: при открытии файла .doc (если уже запущен word) процесс мой самопроизвольно убивается. Поэтому и ошибка, что нет процесса.
Сделал так:
Если расширение файла doc или docx, тогда смотрю все процессы на компе. Если есть процесс WINWORD, тогда свой процесс привязываю к WINWORD'у. То же самое с EXCEL и POWERPNT.

Всё работает, всё хорошо.

Но возникло две проблемы:
1. После закрытия документа, у меня должен файл удаляться, а у меня что происходит? Файл удаляется только после того, как процесс WINWORD полностью завершится, то есть закроются ВСЕ документы WINWORD. Как сделать так, чтобы после закрытия моего файла в ворде. удалялся файл.
2. Нужен какой-то универсальный способ, ибо я написал для трёх программ (WINWORD, EXCEL, POWERPNT - именно так они называются в процессах). А если файл будет Microsoft Visio и иже с ним? А если microsoft решит переименовать процеесы и будут они называться по другому, так что мне программу переписывать надо будет??

Помогите, пожалуйста советом. Спасибо.
PM MAIL   Вверх
eon
Дата 22.10.2010, 05:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 31.8.2010

Репутация: нет
Всего: нет



Цитата(Мурлыкатам_ @ 21.10.2010,  14:49)
Код
prc.WaitForExit();


Можно заменить на
 
Код

while(prc.IsResponding()) { // Могу ошибиться в названии метода, но суть ясна
      Application.DoEvents(); // Кажется ток для вин формс работает, в консольной приладе можноа заменить на тред.слип если продолжение выполнение консоли не принципиально.
}

Заменил на 


Код

while (prc.Responding)
                {
                    Application.DoEvents();
                }


Та же ситуевина: нет процесса связанного....

Код

prc.StartInfo.UseShellExecute = true;

Это также не привело к успеху.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0471 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.