Установите текущую переменную пользовательской среды из кода C++, видимого для другого процесса, такого как cmds
Мне нужно установить локальную переменную среды для текущего пользователя, и она будет видна другим процессам, таким как новая командная строка. Мне это нужно для окон. Я пробовал варианты, такие как putenv и редактирование реестра из кода C++, но новое приглашение cmd показывает старые значения. Прежде всего мне нужно отредактировать переменную PATH вместе с несколькими пользовательскими переменными env. Буду признателен, если я смогу получить рабочий пример кода.
Обратите внимание, что переменная окружения должна сохраняться после выполнения программы.
Мое требование для окон. Я даже пытался запустить setx из кода C++, и он отлично работает, но для переменной PATH он обрезает его до 1024 символов, и я теряю обновление. Есть ли обходной путь к этому?
Если моя формулировка выглядит запутанной в отношении требования. Мне нужно точно такое же поведение, как если бы я использовал setx. Заранее спасибо.
2 ответа
Если вы запустите Cmd.exe из вашего процесса, вы можете контролировать его среду. Переменные среды наследуются от родительского процесса. Они также могут быть отменены, когда вы звоните CreateProcess
,
Если вы измените конфигурацию пользователей / системной среды в реестре (HKCU\Environment
/HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
) и выйдите из системы / перезагрузитесь, тогда первый процесс будет использовать эти новые значения по умолчанию.
Если вы обновляете реестр, вы можете сказать другим приложениям обновить их среды без выхода, передав сообщение:
BroadcastSystemMessage(0, 0, WM_SETTINGCHANGE, 0, (LPARAM)TEXT("Environment"));
В действительности, только Explorer.exe реагирует на это сообщение, но этого достаточно, чтобы повлиять на новые приложения, запускаемые из панели задач / меню "Пуск".
setx
Команда на самом деле является исполняемым файлом, который устанавливает значения в реестре. Если вы хотите смоделировать поведение, в котором вы можете установить переменную среды, которая будет длиться дольше, чем текущий процесс, вам нужно будет записать ее в HKCU\Environment
ключ. HKCU
предназначен для текущего пользователя и может быть записан без повышенных разрешений.
использование RegEdit.exe
или же reg.exe query HKCU\Environment
для просмотра текущих настроек. Из C/C++ вы можете использовать функции реестра. Если вы можете, я рекомендую использовать ATL CRegKey
класс, как это следует RAII и обеспечивает правильную очистку ручек.