Доступ запрещен при попытке закрыть exe-файл через C # в winforms - PullRequest
0 голосов
/ 02 октября 2018

Я открываю и закрываю приложение через приложение Windows Form, но проблема в том, что я получаю Отказано в доступе ошибка.

Вот фрагмент кода из проекта.

try
{
    //This loop wil check the timing.
    for (int i = 0; i < exeStartTimes.Count; i++)
    {
        if (hour == exeStartTimes[i].hour && minute == exeStartTimes[i].minute)
        {
            if (CheckExeIsOpen(tbExeName.Text) == false)
            {
                Process p = new Process();
                p.StartInfo.FileName = (tbExeLocation.Text + tbExeName.Text);
                p.Start();
                AppendLogFile("Started " + tbExeLocation.Text + tbExeName.Text + " on " + time);
            }
        }

        if (hour == exeEndTimes[i].hour && minute == exeEndTimes[i].minute)
        {
            if (CheckExeIsOpen(tbExeName.Text) == true)
            {
                CloseExe(tbExeName.Text);
                AppendLogFile("Closed " + tbExeName.Text + time);
            }
        }
    }
}
catch (Win32Exception w) 
{
    MessageBox.Show("Error occured : " + w.Message);
    AppendLogFile("message      :   " + w.Message);
    AppendLogFile("ErrorCode    :   " + w.ErrorCode.ToString());
    AppendLogFile("Native       :   " +w.NativeErrorCode.ToString());
    AppendLogFile("StackTrace   :   " + w.StackTrace);
    AppendLogFile("Source       :   " + w.Source);
    Exception e = w.GetBaseException();
    AppendLogFile(e.Message);
}

А вот методы закрытия EXE:

private bool CheckExeIsOpen(string exeName)
{
    string name = exeName.Split('.')[0];
    foreach (var process in Process.GetProcesses())
    {
        if (process.ProcessName == name)//process name matched return true appliation is open
        {
            return true;
        }
    }

    return false;//process name not matched return false appliation is closed  
}

private void CloseExe(string exeName)
{
    string name = exeName.Split('.')[0];
    foreach (var process in Process.GetProcesses())
    {
        if (process.ProcessName == name)
        {
            process.Kill();
            AppendLogFile(tbExeName.Text + " Closed on " + DateTime.Now);
        }
    }
}

Сведения об ошибке включают

  1. сообщение: доступ запрещен
  2. Код ошибки: -2147467259

Я обнаружил, что это создает проблему при закрытии приложения.

1 Ответ

0 голосов
/ 02 октября 2018

Согласно документации :

Метод Kill выполняется асинхронно.После вызова метода Kill вызовите метод WaitForExit, чтобы дождаться завершения процесса, или проверьте свойство HasExited, чтобы определить, завершился ли процесс.

и

Если вызов метода Kill выполняется во время завершения процесса, создается Win32Exception для отказа в доступе.

Проблема заключается в том, что вы вызываете Kill дважды, а второй вызов вызывает исключение.Таким образом, решение было бы позвонить:

process.Kill(); 
process.WaitForExit();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...