Установите текущую переменную пользовательской среды из кода 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 и обеспечивает правильную очистку ручек.

Другие вопросы по тегам