Создание переменной окружения: DECLARE INTEGER SetEnvironmentVariable IN WIN32API STRING lpName, STRING lpValue | |
---|---|
AdamAry Автор Сообщений: 843 Дата регистрации: 14.12.2015 |
Всем привет.
Почему вызов функции win api не создаёт переменную?:
Так тоже не создаёт?:
Хотя всё по описанию: www.news2news.com www.news2news.com Исправлено 1 раз(а). Последнее : AdamAry, 03.07.17 07:37 |
Re: Создание переменной окружения: DECLARE INTEGER SetEnvironmentVariable IN WIN32API STRING lpName, STRING lpValue | |
---|---|
Аркадий Сообщений: 252 Откуда: Санкт-Петербург Дата регистрации: 30.11.2005 |
А если следовать приведённому на сайте примеру?
Исправлено 2 раз(а). Последнее : Аркадий, 03.07.17 09:22 |
Re: Создание переменной окружения: DECLARE INTEGER SetEnvironmentVariable IN WIN32API STRING lpName, STRING lpValue | |
---|---|
AdamAry Автор Сообщений: 843 Дата регистрации: 14.12.2015 |
Спасибо Аркадий, не нажал
"Code examples: Reading and setting Environment variables" даёт:
1. Почему? 2. После этого надо перезагружать комп? 3. В переменную окружения пользователя или в переменную окружения для всех пользователей должно записываться это? Если быть точнее записывает куда то, но не в "Environment variables": Последняя строка (? "DebugMode=", getVar ("%DebugMode%") && ) даёт DebugMode= True но я не смог обнаружить эту переменную окружения в "Environment variables" ни в верху для данного пользователя, ни в низу для всей системы. Исправлено 5 раз(а). Последнее : AdamAry, 03.07.17 11:26 |
Re: Создание переменной окружения: DECLARE INTEGER SetEnvironmentVariable IN WIN32API STRING lpName, STRING lpValue | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
А почему ты РЕШИЛ что этот вызов не создаёт переменную? Это лишь встроенная фоксовая функция GETENV() не видит изменений в списке этих переменных. Первый вариант избыточен - строки не нужно принимать обратно, т.к. АПИ функция Set* их не изменяет. Потому что надо было ОДИН раз запускать приведенный код для проверки. Все запуски после первого будут давать такой результат, т.к. переменная УЖЕ создана при первом запуске. И переменная вполне себе "записана" - вроде как это совершенно очевидно по тому что возвращает ? _GetEnv (lcName). Иначе откуда бы он взял строку True? Если перезапустить компьютер, то данный процесс завершится, а равно и все переменные которые он ДЛЯ СЕБЯ прописал тоже пропадут. Этот код НЕ ЗАПИСЫВАЕТ ничего в реестр и не влияет на систему - ни на текущего пользователя, ни тем более на "всех пользователей". Он создаёт переменную исключительно для того процесса который вызвал данный код - ну и для порождаемых им дочерних процессов, если он их таки порождает, и позволяет им "наследовать" свой список переменных окружения, а не задаёт явно какой-то иной... msdn.microsoft.com Параметр lpEnvironment. ------------------ WBR, Igor |
Re: Создание переменной окружения: DECLARE INTEGER SetEnvironmentVariable IN WIN32API STRING lpName, STRING lpValue | |
---|---|
AdamAry Автор Сообщений: 843 Дата регистрации: 14.12.2015 |
Спасибо Igor. Только мне не всё понятно: переменная есть (в блоке, указанном lpEnvironment), но её нет в в "Environment variables", парадокс или я не в теме?
Да потому что не нашёл в "Environment variables" визуально. Как же она возвратит то чего нет в "Environment variables". Не, ну, если конечно эта переменная невесть где записана (Параметр lpEnvironment) и невесть как получается, то вроде как бы она есть, но ведь её нет в "Environment variables" Исправлено 4 раз(а). Последнее : AdamAry, 03.07.17 12:43 |
Re: Создание переменной окружения: DECLARE INTEGER SetEnvironmentVariable IN WIN32API STRING lpName, STRING lpValue | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Диалоговое окно в настройках винды не более чем способ записать эти данные в реестр - из реестра винда их берёт при запуске некоторых программ - например шелла, или системных сервисов. Можно сказать что это "значения по умолчанию".
Большинство других программ уже запускаются ИЗ этих программ, и "наследуют" те переменные окружения, которые были у родительской программы, либо же при их запуске тот же шелл считывает данные из реестра (текущие) и формирует набор переменных окружения для нового процесса. Поэтому в старых версиях Windows требовалось либо перезагрузится, либо выйти и снова зайти в пользовательскую сессию чтобы программы "увидели" изменения внесённые в этом диалоге. В новых версиях для прикладных программ запускаемых "напрямую" это уже не требуется - т.е. винда при запуске нового процесса сформирует набор переменных окружения с "текущими" значениям. При том для многих старых утилит/программ, например файл-менеджеров этого не происходит - т.е. они не реагируют на соответствующие изменения в реестре, и запускаемые из них программы изменений "не видят". Вообще сами по себе Environment Variables это не более чем простая структура в памяти, где хранятся в текстовом виде пары - имя/значение. И как таковые они существовали ещё в MSDOS. Естественно, каждый процесс имеет свою копию данной структуры - т.е. переменные окружения одного процесса НИКАК не связаны с переменными окружения другого процесса. ------------------ WBR, Igor |
Re: Создание переменной окружения: DECLARE INTEGER SetEnvironmentVariable IN WIN32API STRING lpName, STRING lpValue | |
---|---|
AdamAry Автор Сообщений: 843 Дата регистрации: 14.12.2015 |
В каком месте реестра хранятся переменные окружения?: здесь [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment] или [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment] или [HKEY_CURRENT_USER\Volatile Environment] и кто из них имеет прерогативу, т.е. имеет право отменять такую же переменную в другой группе? Исправлено 2 раз(а). Последнее : AdamAry, 04.07.17 08:05 |
Re: Создание переменной окружения: DECLARE INTEGER SetEnvironmentVariable IN WIN32API STRING lpName, STRING lpValue | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Значения по умолчанию для переменных окружения хранятся в ветках:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment системные (для всех пользователей) HKEY_CURRENT_USER\Environment пользовательские (для каждого пользователя свои, т.к. ВЕСЬ раздел HKEY_CURRENT_USER уникален для каждого пользователя). HKEY_LOCAL_MACHINE\SYSTEM\ControlSetXXX это механизм хранения (для целей отката/безопасной загрузки после сбоев) копий системных настроек. Раньше их было до 3 штук, и одна из них являлась "текущей", и была доступна через HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet - этот путь работает по сути как ссылка на определённую ветвь реестра. В ветке HKEY_LOCAL_MACHINE\SYSTEM\Select есть ключи определяющие какая из копий "активна сейчас", является "точно рабочей" и т.п. Сейчас (в современных версиях ОС) там обычно всего одна копия ControlSet001 и, соответственно, CurrentControlSet ссылается именно на неё. Т.е. это "одно и то же". Так же как, к примеру, ветка HKEY_LOCAL_MACHINE\SOFTWARE\Classes и весь раздел HKEY_CLASSES_ROOT или ветка HKEY_USERS\S-1-5-21-тут_ещё_много_цифр и раздел HKEY_CURRENT_USER... По приоритету - его определяет система отдельно для каждой переменной. Обычно то что прописано на "пользовательском" уровне переопределяет то что описано на "системном". Но для переменной PATH служащей для задания путей поиска компонент/программ, скажем, система сцепляет значения из системной ветки с пользовательскими. При том "пользовательские" пути оказываются в конце списка, и потому получаются менее приоритетными. HKEY_CURRENT_USER\Volatile Environment Это "динамические" переменные - они НЕ сохраняются в файлах реестра, и существуют только во время работы системы. При том там ещё и вложенные ключи возникают - по одному на каждую сессию (в системе может быть одновременно несколько сессий - как для разных, так и для одного и того-же пользователя - особенно если это не клиентская а серверная версия винды). ------------------ WBR, Igor |
Re: Создание переменной окружения: DECLARE INTEGER SetEnvironmentVariable IN WIN32API STRING lpName, STRING lpValue | |
---|---|
AdamAry Автор Сообщений: 843 Дата регистрации: 14.12.2015 |
Не знал, спасибо. Оказывается приоритет неоднозначный. Если я правильно понял: HKEY_LOCAL_MACHINE\SOFTWARE\Classes равен всему разделу HKEY_CLASSES_ROOT , не так ли? HKEY_CLASSES_ROOT это рудимент, дублирующий HKEY_LOCAL_MACHINE\SOFTWARE\Classes и соответственно является 5 ым колесом или HKEY_CLASSES_ROOT необходим для каких то целей? HKEY_CURRENT_USER это тоже отживший рудимент равный ветке HKEY_USERS\S-1-5-21-тут_ещё_много_цифр и без .... _classes, не так ли? Исправлено 4 раз(а). Последнее : AdamAry, 05.07.17 14:12 |
© 2000-2024 Fox Club  |