2009-04-21 2 views
0

Я могу успешно запустить новый процесс с помощью ShellExecuteEx, но если я получаю доступ к свойству HasExited, выдается исключение Win32Exception. Каково это исключение и как проверить, жив ли процесс?Почему hasExited throw 'System.ComponentModel.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 
} 

Благодаря

+0

Можете ли вы опубликовать фрагмент кода? –

+0

Я обновил вопрос. – mimic

+0

вы получаете исключение на Vista или Windows 7? – Giorgi

ответ

0

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

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

EDIT: Поскольку вы выполняете runas, вы получаете только доступ SYNCHRONIZE на дескрипторе, а не PROCESS_QUERY_INFORMATION доступ, следовательно GetExitCodeProcess не удается, что приводит к hasEnded, бросающему исключение Win32.

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

+0

уверен, что я установил fMask еще, что я не смог бы получить дескриптор процесса. Я использую эту функцию, чтобы иметь возможность запускать процесс как повышенный в Vista как «runas». Насколько я знаю, это единственная возможность сделать это в Vista. – mimic

+0

Спасибо, runas объясняет, почему вы это видите. Ответ обновлен. – Michael

-1

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

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

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

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

вместо линия должна быть

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

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

0

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