Обновить переменные системной среды для всех процессов без выхода из системы / перезапуска в C++

Я пишу программу на C++, которая добавляет новый каталог в переменную среды path для системы. Каталог успешно добавлен сRegSetValueEx() функции, но изменения отражаются не для всех процессов.

я пытался BroadcastSystemMessage() а также SendMessageTimeout() функционирует отдельно, как показано ниже

LPCTSTR keyPath = TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Environment");
        
BroadcastSystemMessage(0, 0, WM_SETTINGCHANGE, 0, (LPARAM)keyPath); 

а также

LPCTSTR keyPath = TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Environment");

SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)keyPath, SMTO_BLOCK, 100, NULL); 

но они оба не работают, однако, когда я перезапускаю свою систему, изменения отражаются.

Что я хочу

Я хочу, чтобы изменения отражались для всего процесса без выхода из системы, и возможно, несколько дней назад я установил программное обеспечение (Composer https://getcomposer.org/), которое добавил свой путь к среде и обновил переменные среды для всех процессов, не требуя перезагрузка системы.

Вот несколько полезных ссылок, которые я уже просматривал

1 ответ

Я понял, что делаю не так, я использовал

LPCTSTR keyPath = TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Environment");
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)keyPath, SMTO_BLOCK, 100, NULL); 

когда это должно быть

LPCTSTR keyPath = TEXT("Environment");
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)keyPath, SMTO_BLOCK, 100, NULL);

и это обновило переменные среды для других процессов без перезапуска.

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