Здравствуйте, lumf, Вы писали:
L>Здравствуйте, Odi$$ey, Вы писали:
OE>>Здравствуйте, MatFiz, Вы писали:
L>>>>если бы можно было просто перестарторвать приложение, то все бы уже было давно решено... MF>>>То приложение, из которого ты запускаешь свое приложение, почти наверняка тоже надо рестартануть
OE>>вот именно
L>Итак, командная строка ни при чем.
L>Нужно получить имя процесса, породившего процесс твоего экзешника.
L>Если это не %SystemRoot%\system32\services.exe (WinNT 4.0, для W2k подскажет Alex Fedotov, я сам не помню),
L>то мы работаем в user mode. Если же родитель процесса — services.exe (AKA SCM), то мы работаем в режиме сервиса.
L>В системе сервисы запускает только SCM
L>
L>что будет если я убью к примеру вот этот процесс %SystemRoot%\system32\services.exe ? вот он как раз и закешировал перемнные окружения, а раз он родитель, то все передалось моему сервису, так?
Здравствуйте, MatFiz, Вы писали:
L>>если бы можно было просто перестарторвать приложение, то все бы уже было давно решено... MF>То приложение, из которого ты запускаешь свое приложение, почти наверняка тоже надо рестартануть
Здравствуйте, dimchick, Вы писали:
D>Здравствуйте, lumf, Вы писали:
L>>надо бы какое-нить "правильное" решение. админское
D>предлагаю устроить конкурс на учший способ решения проблемы: D>вот 3 варианта
D>- програмерсоке — послать WM_SETTINGCHANGE
не спортивно
D>- админское — нажать кнопку reset
ну ты видимо не видел админов нормальных, раз это админский способ
D>- хацкерсоке — кинуть dll в system32/exe folder
Здравствуйте, lumf, Вы писали:
L>если бы можно было просто перестарторвать приложение, то все бы уже было давно решено...
Тем не менее, это правильный подход. Возможно, твое приложение на завершило работу, либо инсталлятор не задал нужные переменные окружения сразу, а только после перезапуска. Инсталляторы бывают очень хитрыми.
При запуске приложения ещё со времён DOS оно получает копию переменных окружения, которые действуют до окончания работы приложения. Сам понимаешь, что будет, если менять во время работы. Но в Windows и это возможно, есть уведомление ОС об изменении переменных окружения. Дальше дело программы, как на это реагировать.
Здравствуйте, akasoft, Вы писали:
A>Здравствуйте, lumf, Вы писали:
L>>если бы можно было просто перестарторвать приложение, то все бы уже было давно решено...
A>Тем не менее, это правильный подход.
возможно так и есть! я же не спорю... НО, тем не менее внимательно посмотрите на то что происходит у меня...
у меня windows service.... я его останавливаю, запускаю.... переменные те же, не обновились...
а вот если я перегружаюсь, то переменные уже новые...
Здравствуйте, lumf, Вы писали:
L>у меня windows service.... я его останавливаю, запускаю.... переменные те же, не обновились...
Ты не написал про это в исходном сообщении, у служб другое поведение, определяемое system account.
L>а вот если я перегружаюсь, то переменные уже новые...
Возможно, переменные окружения для system account задаются одноразово, надо МСДН смотреть. Ты точно останавливаешь службу, а не ставишь на паузу?
Обрати внимание на то, что есть переменные окружения пользователя, а есть системные. Пользовательские видны только конкретному пользователю.
Здравствуйте, akasoft, Вы писали:
A>Здравствуйте, lumf, Вы писали:
A>Ты не написал про это в исходном сообщении, у служб другое поведение, определяемое system account.
L>>а вот если я перегружаюсь, то переменные уже новые...
A>Ты точно останавливаешь службу, а не ставишь на паузу?
точно
A>Обрати внимание на то, что есть переменные окружения пользователя, а есть системные. Пользовательские видны только конкретному пользователю.
сервис стартует как local system
про то что переменные бывают разные знаю... добавляю через мой компьютер--->свойства----->дополнительно--->переменные среды--->нижнее окошко
L>суть проблемы: L>есть .net приложение ---клиент базы данных oracle
L>до этого я поставил ораклового клиента и в переменных окружения дописал путь к нему
L>запускаю свою программу, вылетает исключение: не могу подгрузить oci.dll
L>смотрю filemonom---пытается искать эту dll во все переменных окружения кроме только что созданной.
L>вопрос: что сделать чтобы framework увидел новую переменную без перегрузки компа?
Скорее всего SCM (Service Control Manager) необновил свои переменные окружения.
И скорее всего это переменная PATH. Как вариант попробуй во время запуска считывать переменные окружения:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
Здравствуйте, dimchick, Вы писали:
D>Здравствуйте, lumf, Вы писали:
L>>привет всем
L>>суть проблемы: L>>есть .net приложение ---клиент базы данных oracle
L>>до этого я поставил ораклового клиента и в переменных окружения дописал путь к нему
L>>запускаю свою программу, вылетает исключение: не могу подгрузить oci.dll
L>>смотрю filemonom---пытается искать эту dll во все переменных окружения кроме только что созданной.
L>>вопрос: что сделать чтобы framework увидел новую переменную без перегрузки компа?
D>Скорее всего SCM (Service Control Manager) необновил свои переменные окружения. D>И скорее всего это переменная PATH. Как вариант попробуй во время запуска считывать переменные окружения: D>HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
и еще тут
HKEY_CURRENT_USER\Environment
короче ничего меня не спасло кроме перезагрузки... Вот теперь все же интересно чей это косяк?
После того как я изменяю переменную окружения, все записи в реестре обновлются, в командной сроке изменения видны.
а вот при старте сервиса смотрю filemonom---> ищет dll везде кроме вновь прописанного пути.
кто, откуда и в какой момент читает значение переменной path?
Сиськи и процессоры
Re: framework и переменые окружения
От:
Аноним
Дата:
19.09.06 07:55
Оценка:
L>суть проблемы: L>есть .net приложение ---клиент базы данных oracle
L>до этого я поставил ораклового клиента и в переменных окружения дописал путь к нему
L>запускаю свою программу, вылетает исключение: не могу подгрузить oci.dll
L>смотрю filemonom---пытается искать эту dll во все переменных окружения кроме только что созданной.
L>вопрос: что сделать чтобы framework увидел новую переменную без перегрузки компа?
А может это Framework не перестартовывается — ну, типа он разделяемый между несколькими приложениями или что-нибудь подобное. Под .NET кто-то обещал, что твоя программа будет отдельным процессом ОС?
А>А может это Framework не перестартовывается — ну, типа он разделяемый между несколькими приложениями или что-нибудь подобное. Под .NET кто-то обещал, что твоя программа будет отдельным процессом ОС?
тоже об этом подумал... но как это реально проверить?
Здравствуйте, lumf, Вы писали:
L>Здравствуйте, dimchick, Вы писали:
D>>Скорее всего SCM (Service Control Manager) необновил свои переменные окружения.
L>возможно.... L>надо попробовать.
D>>И скорее всего это переменная PATH. Как вариант попробуй во время запуска считывать переменные окружения:
L>именно path
D>>HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
L>читать руками сам ничего не хочу.... не в том задача... нужно чтобы oracleclient сам обратился туда и подцепил oci.dll
тогда брось oci.dll в system32 или под ноги exe
надо попробовать еще после изменения реестра послать броадкастом WM_SETTINGCHANGE. может SCM подхватит.
Здравствуйте, dimchick, Вы писали:
D>Здравствуйте, lumf, Вы писали:
L>>Здравствуйте, dimchick, Вы писали:
D>>>Скорее всего SCM (Service Control Manager) необновил свои переменные окружения.
L>>возможно.... L>>надо попробовать.
D>>>И скорее всего это переменная PATH. Как вариант попробуй во время запуска считывать переменные окружения:
L>>именно path
D>>>HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
L>>читать руками сам ничего не хочу.... не в том задача... нужно чтобы oracleclient сам обратился туда и подцепил oci.dll
D>тогда брось oci.dll в system32 или под ноги exe
не спортивно, так как клиент оракла это не только oci.dll
D>надо попробовать еще после изменения реестра послать броадкастом WM_SETTINGCHANGE. может SCM подхватит.
надо бы какое-нить "правильное" решение. админское
Здравствуйте, Odi$$ey, Вы писали:
OE>Здравствуйте, MatFiz, Вы писали:
L>>>если бы можно было просто перестарторвать приложение, то все бы уже было давно решено... MF>>То приложение, из которого ты запускаешь свое приложение, почти наверняка тоже надо рестартануть
OE>вот именно
Итак, командная строка ни при чем.
Нужно получить имя процесса, породившего процесс твоего экзешника.
Если это не %SystemRoot%\system32\services.exe (WinNT 4.0, для W2k подскажет Alex Fedotov, я сам не помню),
то мы работаем в user mode. Если же родитель процесса — services.exe (AKA SCM), то мы работаем в режиме сервиса.
В системе сервисы запускает только SCM
что будет если я убью к примеру вот этот процесс %SystemRoot%\system32\services.exe ? вот он как раз и закешировал перемнные окружения, а раз он родитель, то все передалось моему сервису, так?
Здравствуйте, Аноним, Вы писали:
А>А может это Framework не перестартовывается — ну, типа он разделяемый между несколькими приложениями или что-нибудь подобное. Под .NET кто-то обещал, что твоя программа будет отдельным процессом ОС?
А ты запусти дотнетовское приложение и посмотри в менеджере процессов. Конечно будет.