Почему hasExited выбросило 'System.ComponentModel.Win32Exception'? - PullRequest
0 голосов
/ 22 апреля 2009

Я могу успешно запустить новый процесс, используя ShellExecuteEx, но если я получаю доступ к свойству HasExited, выдается исключение Win32Exception. Что это за исключение и как я могу проверить, жив ли процесс?

ShellExecuteEx(ref info);
clientProcessId = NativeMethods.GetProcessId(info.hProcess);
Process clientProcess = Process.GetProcessById((int)clientProcessId);

if (clientProcess.HasExited) //<---- throws Win32Exception, but the process is alive! I can see its window
{
   //run new one
}

Спасибо

Ответы [ 3 ]

0 голосов
/ 22 апреля 2009

Для информации, вы установили для fMask значение SEE_MASK_NOCLOSEPROCESS, чтобы hProcess действовал?

Кроме того, почему вы используете P / Invoke в ShellExecuteEx, почему бы не использовать Process.Start с ProcessStartInfo, который будет обрабатывать ShellExecuteEx для вас?

РЕДАКТИРОВАТЬ: Так как вы выполняете runas, вы получаете только доступ SYNCHRONIZE для дескриптора, но не PROCESS_QUERY_INFORMATION доступ, следовательно, GetExitCodeProcess завершается ошибкой, в результате чего hasEnded вызывает исключение Win32.

В качестве обходного пути вы можете P / Invoke WaitForSingleObject с таймаутом, равным нулю, проверить, завершился ли процесс.

0 голосов
/ 08 июня 2011

Я столкнулся с этой проблемой сегодня. Есть другое решение. Функция WaitForExit отлично работает в другой пользовательской среде. Поэтому, если вы запускаете runas для повышения привилегий процесса, вы можете запросить статус процесса с помощью этой функции.

0 голосов
/ 22 апреля 2009

скорее всего выдает ошибку, потому что объект больше не существует и, следовательно, вы проверяете уничтоженный объект

аналогичная проблема возникает в VB при работе с картинками

function openimg(imgpath)
img = get image from path
return img
end function

, который по какой-то причине не вернет изображение должным образом

вместо строки должно быть

вернуть img.clone (), чтобы правильно вернуть изображение

однако это мой пример

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