WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  CreateProcess и Environments

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   CreateProcess и Environments
the_moon опубликован 11-01-2002 10:29 MSK   Click Here to See the Profile for the_moon   Click Here to Email the_moon  
Привет,

есть у меня прога котрая по CreateProcess стартует два процесса. Первый из них меняет переменные окружения, PATH, LIB, INCLUDE ну и там некоторые другие, вообщем секция environments в registry. Затем запускается второй процесс, который вообщем то простой batch файл который запускает разные там проги, которые активно пользуются переменными окружения и они не мои эти программы. Так вот проблема в том что второй процесс работает получается со старыми environments. Есть параметр у CreateProcess

LPVOID lpEnvironment, // new environment block

но кам мне этот блок получить, мне посоветовали в ручную читать переменные, экспандировать и передовать, но мне это совсем не нравится.

ADK опубликован 11-01-2002 12:04 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
А ты дожидаешься завершения первого процесса? Ну там WaitForSingleObject и т.д.?
the_moon опубликован 11-01-2002 13:42 MSK     Click Here to See the Profile for the_moon  Click Here to Email the_moon     
конечно
the_moon опубликован 11-01-2002 19:45 MSK     Click Here to See the Profile for the_moon  Click Here to Email the_moon     
Ну может кто что знает, а? посоветуйте плиииз
michl_m опубликован 13-01-2002 14:23 MSK     Click Here to See the Profile for michl_m  Click Here to Email michl_m     
Получить блок окружения текущего процесса можно через GetEnvironmentStrings(). Кажется, его потом нужно освобождать через FreeEnvironmentStrings(LVOID...).
Но второй стартующий процесс наследует в твоем сценарии блок окружения первого на момент запуска, т.е. "старый". Потом ты в первом процессе чего-то меняешь, но второй этого уже не видит. Тебе нужно использовать какие-нибудь другие способы передачи данных между процессами, например, WM_COPYDATA

the_moon опубликован 13-01-2002 15:05 MSK     Click Here to See the Profile for the_moon  Click Here to Email the_moon     
ОК, можно тогда както прогу/процесс стартануть, но так чтобы она не была дочерним процессом моей программы, есть вроде ShellExecute не то ли это? Или тот же механизм стоит за этой функцией, Ведь по сути Explorer запущен до изменения environments и он как то обновляет их, как он вообще запускает процессы?
michl_m опубликован 13-01-2002 18:12 MSK     Click Here to See the Profile for michl_m  Click Here to Email michl_m     
Не претендую на 100% правильность, т.к. вплотную не экспериментировал с этим. Но, по моему, так.
В Win98 все процессы видят блок окружения, заданный в autoexec.bat. Это общедоступный блок, его видят все. Но для глобальных изменений нужен перезапуск. В 2000 текущий блок окружения задан для пользователя. Перезапуск не нужен, но нужно выйти и снова войти как тот-же или другой пользователь (Log off).
В 2000 окружение записано в реестре:
HKEY_LOCAL_MACHINE\SYSTEM\CURRENTCONTROLSET\CONTROL\SESSIONMANAGER\ENVIRONMENT и в разделе HKEY_CURRENT_USER\ENVIRONMENT.
Аппликации типа Explorer читают реестр напрямую. Для этого есть WM_SETTINGCHANGE.
В MSDN написано, что

WM_SETTINGCHANGE
wParam = wFlag; // system-wide parameter flag
lParam = (LPARAM) (LPCTSTR) pszSection; // name of changed section or registry

В данном случае нужно посылать - получать с lParam = "Environment".

Т.е Explorer обрабатывает WM_SETTINGCHANGE и читает из реестра.

Опять-таки, судя по всему, тебе все это не подходит, т.к. нет уверенности, что запущенные программы обрабатывают WM_SETTINGCHANGE. Да и в 98, кажется, не работает.

P.S. Объясни, в чем задача. Может есть другой способ, без переменных окружения.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.