чумной глюк с .NET System.Diagnostics.Process.Start()

NataNata

ситуация
есть "основная" прога под .net, которая умеет запускать внешние приложение по требованию юзера
делает она это так (код не мой, поэтому на vb.net, что не суть важно):
[Обработчик нажатия кнопки, все в основном потоке, все круто]
Dim si As New System.Diagnostics.ProcessStartInfo
si.EnvironmentVariables.Add("XXX", YYY)
si.FileName = itemtag.Path
si.UseShellExecute = False
Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(si)
[конец обработчика]
в результате, если таким образом из основной проги запустить консольное приложение (cmd или far то все ок
если же запустить таковым образом прогу, которая создает ОКНО (например, notepad то основная (!) прога падает с access violation (!). Причем, в тестах, пробовали запускать прогу, которая сначала пишет какой-нибудь msgbox, а только потом создает свое основное окно - в результате основная прога падает именно по созданию окна.
Кроме того, если указанный обработчик вынести в отдельный проект, то падений не наблюдается
система xp 32
в каком направлении вообще можно копать? я в полном замешательстве, прямо таки х@#ня какая-то... все усугубляется тем, что глюк этот живет на компах, которые стоят в америке и к которым я ни удаленно не могу подключиться, ни тем более winice-ом порыться на худой конец

okis

указанный обработчик вынести в отдельный проект
а если в отдельный процесс? основная прога — сервис?
Вот это (разрешить взаимодействие с десктопом): http://channel9.msdn.com/forums/TechOff/255690-Allow-service... пробовали?

Dasar

если этот код перенести в пустой проект, то проблема наблюдается?

NataNata

основная прога - не сервис
и запускает - не сервисы
если этот код перенести в пустой проект, то проблема не наблюдается
я вообще не понимаю, отчего идет такая интерференция, в частности в случае
Причем, в тестах, пробовали запускать прогу, которая сначала пишет какой-нибудь msgbox, а только потом создает свое основное окно - в результате основная прога падает именно по созданию окна. То есть, когда юзер нажал OK на msgbox-е

VitMix

А в какой строчке основной программы происходит Access Violation?
Объект p (типа Process) как-нибудь потом используется?

NataNata

> А в какой строчке основной программы происходит Access Violation?
На Application.Run
> Объект p (типа Process) как-нибудь потом используется?
нет, вообще никак

Vyacha

в порядке бреда:
1. что будет если UseShellExecute = true
2. основная прога - не веб-сервером выполняется? по идее, если основной проге запрещено создавать окна, то и порожденные процессы не имеют такого права (правда, MessageBox не вписывается)

NataNata

все оказалось туманнее. Запуск программы = идет вызов CreateProcess. В .net-е жестко вшито, что в параметрах обертки CreateProcess (т.е. System.Diagnostics.Process) вызывается с флагом duplicatehandles = true. Пришлось переписать обертку, чтобы было false
Оставить комментарий
Имя или ник:
Комментарий: