2009-05-18 2 views
0

Следующий код вызывает NullReferenceExceptionProcess.WaitForExit() вызывает NullReferenceException

tStartParameter = String.Format(tStartParameter, tTo, tSubject) 
tProcess = Process.Start(New ProcessStartInfo(tStartParameter) _ 
      With {.UseShellExecute = True}) 
tProcess.WaitForExit() 

tStartParameter составляет:

https://mail.google.com/?view=cm&fs=1&tf=1&[email protected]&su=boogaloo!! 

Используя отладчик, я вижу, что Process.Start возвращается нуль. Итак ... какие-то мысли о том, почему это происходит? Я бы очень хотел заблокировать выполнение программы до тех пор, пока пользователь не выполнит запущенный процесс.

UPDATE: рефакторинга кода к этому:

tStartParameter = String.Format(tStartParameter, tTo, tSubject) 
tProcess = New Process 
tProcess.StartInfo = New ProcessStartInfo(tStartParameter) _ 
        With {.UseShellExecute = True} 
tProcess.Start() 
tProcess.WaitForExit() 

причины этого исключения:

InvalidOperationException: Никакой процесс не связан с этим объектом.

+0

Вам не нужно делать что-то вроде «iexplore » для вашего процесса? –

+0

@JP: Нет. Я не. –

ответ

4

Из MSDN, Process.Start вернется:

новый компонент процесса, который связан с процессом ресурса, или пустая ссылка (Nothing в Visual Basic), если не ресурс процесса запущен (для пример, если существующий процесс повторно используется).

В вашем случае, поскольку вы передаете URL-адрес Process.Start, а не исполняемый файл, вы фактически не начинаете новый процесс. Вы передаете URL-адрес iexplore или независимо от вашего браузера. И поэтому вы получаете нулевой возврат.

В любом случае, что означало бы «заблокировать выполнение программы до тех пор, пока пользователь не выполнит запущенный процесс»? Подождите, пока пользователь не закроет веб-браузер? В этом случае вам может понадобиться что-то вроде:

Process p = Process.Start("iexplore", "http://www.google.com"); 
p.WaitForExit(); 

... который подходит для меня. Однако для этого требуется указать исполняемый файл браузера.

+0

Я надеялся избежать прямого вызова iexplore.exe .. но, похоже, у меня нет выбора. Отличный ответ. Благодарю. –