Есть ли способ установить путь к среде программно в C ++ в Windows? - PullRequest
17 голосов
/ 10 февраля 2009

Можно ли программно установить глобальную переменную среды пути Windows (C ++)?

Насколько я вижу, putenv устанавливает его только для текущего приложения.
Изменение непосредственно в реестре (HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment) также вариант, хотя я бы предпочел методы API, если есть?

Ответы [ 5 ]

26 голосов
/ 10 февраля 2009

MSDN Говорит :

Вызов SetEnvironmentVariable не имеет влияние на системную среду переменные. Чтобы программно добавить или изменить системные переменные среды, добавить их в HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ сессии Раздел реестра Manager \ Environment, затем передать сообщение WM_SETTINGCHANGE с lParam установлен на строку «Окружающая среда». Это позволяет приложения, такие как оболочка, для забрать свои обновления. Обратите внимание, что значения переменных среды перечисленные в этом ключе ограничены 1024 символы.

10 голосов
/ 11 февраля 2009

Как указывалось ранее, чтобы изменить PATH на уровне машины , просто измените эту запись реестра:

HLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

Но вы также можете установить PATH на уровне пользователя , изменив эту запись реестра:

HKEY_CURRENT_USER\Environment\Path

И вы также можете установить PATH на уровне приложения , добавив сведения о приложении \ Path к этой записи реестра:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\
3 голосов
/ 10 февраля 2009

API не существует - способ сделать это - изменить реестр. Измененное значение будет использоваться для процессов, начинающихся после внесения изменения.

Также: обратите внимание, что работающие приложения должны активно обрабатывать сообщение об изменении настроек, а многие (большинство?) Этого не делают.

2 голосов
/ 10 февраля 2009

Да, Вы правы. Вам также нужно применить эти настройки без выхода из системы

Отправить сообщение о приведении Борада ко всем окнам SETTINGCHANGE для параметра (LPARAM) «Среда» с SMTO_ABORTIFHUNG в течение нескольких миллисекунд (5000) с использованием API SendMessageTimeout.

Это то, что делает setX.exe, предоставляемый с ресурсом Kit.

2 голосов
/ 10 февраля 2009

Если вы хотите сделать это через реестр, вы можете посмотреть исходный код этой программы.

Microsoft также предоставляет небольшую утилиту командной строки setx со своими комплектами ресурсов , которая позволит вам сделать это. Кстати, обычная команда set просто позволяет вам определять локальные переменные окружения, я думаю.

...