:: Visual Foxpro, Foxpro for DOS
Создание переменной окружения: DECLARE INTEGER SetEnvironmentVariable IN WIN32API STRING lpName, STRING lpValue
AdamAry
Автор

Сообщений: 843
Дата регистрации: 14.12.2015
Всем привет.

Почему вызов функции win api не создаёт переменную?:
DECLARE INTEGER SetEnvironmentVariable IN WIN32API STRING @lpName, STRING @lpValue
lcVarName = "NLS_LANG22"
lcVarValue = "SomeValue"
? SetEnvironmentVariable(@lcVarName,@lcVarValue)

Так тоже не создаёт?:
DECLARE INTEGER SetEnvironmentVariable IN WIN32API STRING lpName, STRING lpValue
lcVarName = "NLS_LANG22"
lcVarValue = "SomeValue"
? SetEnvironmentVariable(lcVarName,lcVarValue)

Хотя всё по описанию:
www.news2news.com
www.news2news.com



Исправлено 1 раз(а). Последнее : AdamAry, 03.07.17 07:37
Ratings: 0 negative/0 positive
Re: Создание переменной окружения: DECLARE INTEGER SetEnvironmentVariable IN WIN32API STRING lpName, STRING lpValue
Аркадий

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
А если следовать приведённому на сайте примеру?
DECLARE INTEGER GetEnvironmentVariable IN kernel32;
STRING lpName, STRING @lpBuffer, INTEGER nSize
DECLARE INTEGER SetEnvironmentVariable IN kernel32;
STRING lpName, STRING lpValue
lcName = "DebugMode"
? _GetEnv (lcName)
= _SetEnv (lcName, "True")
? _GetEnv (lcName)
FUNCTION _GetEnv(lcName)
LOCAL lcBuffer, lnResult
lcBuffer = SPACE(1024)
lnResult = GetEnvironmentVariable (lcName, @lcBuffer, Len(lcBuffer))
RETURN Iif(lnResult=0, "#nothing#", Left(lcBuffer, lnResult))
FUNCTION _SetEnv(lcName, lcValue)
RETURN SetEnvironmentVariable(lcName, lcValue) <> 0



Исправлено 2 раз(а). Последнее : Аркадий, 03.07.17 09:22
Ratings: 0 negative/1 positive
Re: Создание переменной окружения: DECLARE INTEGER SetEnvironmentVariable IN WIN32API STRING lpName, STRING lpValue
AdamAry
Автор

Сообщений: 843
Дата регистрации: 14.12.2015
Спасибо Аркадий, не нажал
"Code examples: Reading and setting Environment variables"

даёт:
True
.T.
True
но не записывает значение "True" в переменную окружения "DebugMode".
1. Почему?
2. После этого надо перезагружать комп?
3. В переменную окружения пользователя или в переменную окружения для всех пользователей должно записываться это?

Если быть точнее записывает куда то, но не в "Environment variables":
Последняя строка (? "DebugMode=", getVar ("%DebugMode%") && ) даёт DebugMode= True
но я не смог обнаружить эту переменную окружения в "Environment variables" ни в верху для данного пользователя, ни в низу для всей системы.



Исправлено 5 раз(а). Последнее : AdamAry, 03.07.17 11:26
Ratings: 0 negative/0 positive
Re: Создание переменной окружения: DECLARE INTEGER SetEnvironmentVariable IN WIN32API STRING lpName, STRING lpValue
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
AdamAry
Почему вызов функции win api не создаёт переменную?
А почему ты РЕШИЛ что этот вызов не создаёт переменную?
Это лишь встроенная фоксовая функция GETENV() не видит изменений в списке этих переменных.
Первый вариант избыточен - строки не нужно принимать обратно, т.к. АПИ функция Set* их не изменяет.

AdamAry
даёт:
True
.T.
True
Потому что надо было ОДИН раз запускать приведенный код для проверки. Все запуски после первого будут давать такой результат, т.к. переменная УЖЕ создана при первом запуске.
И переменная вполне себе "записана" - вроде как это совершенно очевидно по тому что возвращает ? _GetEnv (lcName). Иначе откуда бы он взял строку True?

Если перезапустить компьютер, то данный процесс завершится, а равно и все переменные которые он ДЛЯ СЕБЯ прописал тоже пропадут.

Этот код НЕ ЗАПИСЫВАЕТ ничего в реестр и не влияет на систему - ни на текущего пользователя, ни тем более на "всех пользователей". Он создаёт переменную исключительно для того процесса который вызвал данный код - ну и для порождаемых им дочерних процессов, если он их таки порождает, и позволяет им "наследовать" свой список переменных окружения, а не задаёт явно какой-то иной...
msdn.microsoft.com
Параметр lpEnvironment.


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Создание переменной окружения: DECLARE INTEGER SetEnvironmentVariable IN WIN32API STRING lpName, STRING lpValue
AdamAry
Автор

Сообщений: 843
Дата регистрации: 14.12.2015
Спасибо Igor. Только мне не всё понятно: переменная есть (в блоке, указанном lpEnvironment), но её нет в в "Environment variables", парадокс или я не в теме?
Igor Korolyov
А почему ты РЕШИЛ что этот вызов не создаёт переменную?
Да потому что не нашёл в "Environment variables" визуально.


AdamAry
Это лишь встроенная фоксовая функция GETENV() не видит изменений в списке этих переменных.
Как же она возвратит то чего нет в "Environment variables".
Не, ну, если конечно эта переменная невесть где записана (Параметр lpEnvironment) и невесть как получается, то вроде как бы она есть, но ведь её нет в "Environment variables"



Исправлено 4 раз(а). Последнее : AdamAry, 03.07.17 12:43
Ratings: 0 negative/0 positive
Re: Создание переменной окружения: DECLARE INTEGER SetEnvironmentVariable IN WIN32API STRING lpName, STRING lpValue
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Диалоговое окно в настройках винды не более чем способ записать эти данные в реестр - из реестра винда их берёт при запуске некоторых программ - например шелла, или системных сервисов. Можно сказать что это "значения по умолчанию".
Большинство других программ уже запускаются ИЗ этих программ, и "наследуют" те переменные окружения, которые были у родительской программы, либо же при их запуске тот же шелл считывает данные из реестра (текущие) и формирует набор переменных окружения для нового процесса. Поэтому в старых версиях Windows требовалось либо перезагрузится, либо выйти и снова зайти в пользовательскую сессию чтобы программы "увидели" изменения внесённые в этом диалоге. В новых версиях для прикладных программ запускаемых "напрямую" это уже не требуется - т.е. винда при запуске нового процесса сформирует набор переменных окружения с "текущими" значениям. При том для многих старых утилит/программ, например файл-менеджеров этого не происходит - т.е. они не реагируют на соответствующие изменения в реестре, и запускаемые из них программы изменений "не видят".

Вообще сами по себе Environment Variables это не более чем простая структура в памяти, где хранятся в текстовом виде пары - имя/значение. И как таковые они существовали ещё в MSDOS.
Естественно, каждый процесс имеет свою копию данной структуры - т.е. переменные окружения одного процесса НИКАК не связаны с переменными окружения другого процесса.


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Создание переменной окружения: DECLARE INTEGER SetEnvironmentVariable IN WIN32API STRING lpName, STRING lpValue
AdamAry
Автор

Сообщений: 843
Дата регистрации: 14.12.2015
Igor Korolyov
считывает данные из реестра (текущие) и формирует набор переменных окружения для нового процесса
В каком месте реестра хранятся переменные окружения?:
здесь
[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
Ratings: 0 negative/0 positive
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
Ratings: 0 negative/2 positive
Re: Создание переменной окружения: DECLARE INTEGER SetEnvironmentVariable IN WIN32API STRING lpName, STRING lpValue
AdamAry
Автор

Сообщений: 843
Дата регистрации: 14.12.2015
Igor Korolyov
По приоритету - его определяет система отдельно для каждой переменной. Обычно то что прописано на "пользовательском" уровне переопределяет то что описано на "системном". Но для переменной PATH служащей для задания путей поиска компонент/программ, скажем, система сцепляет значения из системной ветки с пользовательскими. При том "пользовательские" пути оказываются в конце списка, и потому получаются менее приоритетными.
Не знал, спасибо. Оказывается приоритет неоднозначный.

Если я правильно понял: 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
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 24 shumik73  (Гостей: 23)

© 2000-2024 Fox Club 
Яндекс.Метрика