Доступ к пользовательской переменной среды без перезагрузки (с использованием C ++) - PullRequest
4 голосов
/ 11 января 2012

Я пишу программу на C ++, которая использует преимущества общесистемной переменной среды. Эта переменная устанавливается установщиком MSI. Позже моя программа читает его с помощью API GetEnvironmentVariable ().

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

То, что кажется странным, это то, что если (без перезагрузки) я щелкаю правой кнопкой мыши по Моему компьютеру, а затем перехожу в Свойства -> Дополнительно и нажимаю «Переменные среды», моя переменная среды находится в этом списке, но по какой-то причине GetEnvironmentVariable () до сих пор не видит его.

Так есть ли другой API, который я могу использовать, который будет работать без перезагрузки системы? (Как свойства системы могут ясно видеть это тогда.)

Ответы [ 2 ]

3 голосов
/ 11 января 2012

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

 SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
    (LPARAM) "Environment", SMTO_ABORTIFHUNG,
    5000, &dwReturnValue);

Explorer правильно обрабатывает это сообщение, поэтому программы, запущенные после этой трансляции, увидят изменения.

  1. Также технически вам не нужно перезагружаться, простой выход из системы и логина будет достаточно
  2. Другой вариант - просто перезапустить проводник
1 голос
/ 03 мая 2013

Я недавно столкнулся с чем-то подобным, и передача сообщения - это правильный путь, как объяснено в этом кб (и парапурой):

http://support.microsoft.com/kb/104011

однако я бы предложил_T () вокруг «Environment» (или, возможно, «L»), чтобы убедиться, что вы передаете правильную строку (ansi или wide).как это:

    SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
        (LPARAM) _T("Environment"), SMTO_ABORTIFHUNG,
        5000, &dwReturnValue);

я использовал выше в приложении командной строки.без _T () отправка сообщения будет успешной, но моя система, похоже, никогда не получит обновление переменной среды.

Кстати, командная строка 'setx', вероятно, использует тот же механизм для обновления переменных среды.Кроме того, я использую это в ATL DLL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...