Автор
|
Тема: CreateProcess и Environments
|
the_moon |
опубликован 11-01-2002 10:29 MSK
Привет,есть у меня прога котрая по CreateProcess стартует два процесса. Первый из них меняет переменные окружения, PATH, LIB, INCLUDE ну и там некоторые другие, вообщем секция environments в registry. Затем запускается второй процесс, который вообщем то простой batch файл который запускает разные там проги, которые активно пользуются переменными окружения и они не мои эти программы. Так вот проблема в том что второй процесс работает получается со старыми environments. Есть параметр у CreateProcess LPVOID lpEnvironment, // new environment block но кам мне этот блок получить, мне посоветовали в ручную читать переменные, экспандировать и передовать, но мне это совсем не нравится.
|
ADK
|
опубликован 11-01-2002 12:04 MSK
А ты дожидаешься завершения первого процесса? Ну там WaitForSingleObject и т.д.? |
the_moon
|
опубликован 11-01-2002 13:42 MSK
конечно |
the_moon
|
опубликован 11-01-2002 19:45 MSK
Ну может кто что знает, а? посоветуйте плиииз |
michl_m
|
опубликован 13-01-2002 14:23 MSK
Получить блок окружения текущего процесса можно через GetEnvironmentStrings(). Кажется, его потом нужно освобождать через FreeEnvironmentStrings(LVOID...). Но второй стартующий процесс наследует в твоем сценарии блок окружения первого на момент запуска, т.е. "старый". Потом ты в первом процессе чего-то меняешь, но второй этого уже не видит. Тебе нужно использовать какие-нибудь другие способы передачи данных между процессами, например, WM_COPYDATA |
the_moon
|
опубликован 13-01-2002 15:05 MSK
ОК, можно тогда както прогу/процесс стартануть, но так чтобы она не была дочерним процессом моей программы, есть вроде ShellExecute не то ли это? Или тот же механизм стоит за этой функцией, Ведь по сути Explorer запущен до изменения environments и он как то обновляет их, как он вообще запускает процессы? |
michl_m
|
опубликован 13-01-2002 18:12 MSK
Не претендую на 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. Объясни, в чем задача. Может есть другой способ, без переменных окружения.
|