2010-02-16 1 views
3

В настоящее время я пишу неуправляемую программу на C++, которая работает с переменной системной среды. Я получаю значение с помощью GetEnvironmentVariable (...). Теперь у меня есть программа на C#, которая может изменить эту переменную в любое время, например. как это:Обновление переменной окружения системы из C++

Environment.SetEnvironmentVariable("CalledPath", System.Windows.Forms.Application.ExecutablePath, EnvironmentVariableTarget.Machine); 

Проблема заключается в том, что программа C++ не обновляет эту переменную (или его блок среды в целом) автоматически, так что я до сих пор работает со старым значением, если я не перезапустить программу, которая не является на самом деле хорошо. Есть ли способ обновить блок среды или, желательно, другой способ прочитать переменные системной среды?

Спасибо заранее, Руссо

+1

Я не думаю, что можно обновить среду запущенной программы. – Tronic

ответ

2

Спасибо, ребята, но я, наконец, понял это сам. Поскольку значения, которые я получаю с помощью GetEnvironmentVariable, не являются текущими, я читаю значения непосредственно из реестра. Переменные машины окружения хранятся в

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

Я прочитал их через RegQueryValueEx (...) функции, которая работает отлично на RegOpenKeyEx (...) и.

-1

Посмотрите на PutEnv() - функция C-среды выполнения (или МС предпочтительным _putenv() и _putenv_s() -. Для C++ эквивалент для обновления

GETENV() и аналогичные читает в строке окружения.

K

+0

Я не думаю, что это влияет на среду другого работающего процесса – Mark

+0

Да, помогло бы, если бы я правильно прочитал вопрос :-) –

-1

Я считаю, что это _putenv() на Windows.

+0

Не думаю, что это влияет на среду другого работающего процесса – Mark

+0

Конечно, нет - вам нужно fork процесс для наследования среды. –

+0

ОП пытается передать переменную БЕЗ повторения программы, которую она передает – Mark

1

Вы не можете. Каждый процесс получает копию переменных среды своего родителя. Поскольку он получает только копию, он не может изменить среду родителя или любой другой выполняемый процесс.

4

Чтобы сделать длинную историю, переменные окружения не будут работать надежно как форма межпроцессного взаимодействия - вам действительно нужно переключиться на что-то еще.

Для работы обеим программам потребуется доступ к некоторым общим блокам переменных среды, но на самом деле каждый процесс получает свою независимую копию набора переменных окружения. Хуже того, наиболее типичные (C и C++) стандартные библиотеки не позволяют вам работать с , что напрямую - вместо этого они делают еще копию переменных окружения, с которыми вы будете работать. Когда/если вы вызываете getenv() или _putenv(), задействуется только внутренняя копия переменной окружения переменной окружения. Это означает, что даже если вы можете изменить переменные среды процесса, программа, запущенная в этом процессе , все еще не получит новые данные.

Итак, вам действительно нужно заново подумать, что вы делаете. Есть лоты возможности отправки данных из одной программы в другую, включая сообщение Windows (например, WM_COPYDATA), анонимный или именованный канал, почтовый ящик, область разделяемой памяти, сокет и т. Д. Список длинный, но все еще не включает переменные среды.

0

Вы сохраняете изменения переменной среды до тех пор, пока это возможно, в контексте вызова, который вы показываете.См. this MSDN explanation перечисления EnvironmentVariableTarget.

С EnvironmentVariableTarget.Machine настройки вы используете в настоящее время, то изменение переменной будет сохраняться до тех пор, как работает процесс вашей программы, так что все остальные процессы будут иметь возможность читать эту переменную на время выполнения вашей программы:

Сохраняется переменная среды или , извлеченная из ключа HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment в системном реестре Windows .

Когда пользователь создает переменную окружения в операции настройки, операционная система хранит переменную среды в системе реестре, но не в текущем процессе. Если какой-либо пользователь на локальном компьютере запускает новый процесс, операционная система копирует переменную окружения из реестра в этот процесс.

Когда процесс завершается, операционная система разрушает переменную среды в этом процессе. Однако переменная окружения в реестр сохраняется до тех пор, пока пользователь не удалит его программно или не примет средства операционной системы. [Emphasis mine.]