Как получить значение системной перменной?
Модератор: Дед Пахом
					Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
	При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Как получить значение системной перменной?
Собственно subj
в частности %UserProfile%
с уважением jura
			
			
									
						в частности %UserProfile%
с уважением jura
- StillZero
 - Ветеран
 - Сообщения: 460
 - Зарегистрирован: 06 Июль 2005, 2:17
 - Откуда: Хабаровск
 - Благодарил (а): 1 раз
 - Поблагодарили: 1 раз
 - Контактная информация:
 
сам не пробовал
SHGetFolderPath и CSIDL_PERSONAL
MSDN:
The following code fragment uses SHGetFolderPath to find or create a folder and then creates a file in it.
			
			
									
						SHGetFolderPath и CSIDL_PERSONAL
MSDN:
The following code fragment uses SHGetFolderPath to find or create a folder and then creates a file in it.
Код: Выделить всё
TCHAR szPath[MAX_PATH];
if(SUCCEEDED(SHGetFolderPath(NULL, 
                             CSIDL_PERSONAL|CSIDL_FLAG_CREATE, 
                             NULL, 
                             0, 
                             szPath))) 
{
    PathAppend(szPath, TEXT("New Doc.txt"));
    HANDLE hFile = CreateFile(szPath, ...);
}
Re: Как получить значение системной перменной?
GetEnvironmentVar(*CSTRING,*CSTRING,ULONG),ULONG,PASCAL,RAW,NAME('GetEnvironmentVariableA')jura писал(а):Собственно subj
в частности %UserProfile%
с уважением jura
Первый параметр - наименование переменной
Второй - куда класть
Третий - максимальная длина
- 
				Juffin
 - Новичок
 - Сообщения: 19
 - Зарегистрирован: 01 Сентябрь 2005, 13:18
 - Откуда: Saint-Petersburg, Russia
 
Re: Как получить значение системной перменной?
А что звездочку перед ULONG забыл?GetEnvironmentVar(*CSTRING,*CSTRING,ULONG),ULONG,PASCAL,RAW,NAME('GetEnvironmentVariableA')
Правильнее так - GetEnvironmentVar(*CSTRING,*CSTRING,*ULONG),ULONG,PASCAL,RAW,NAME('GetEnvironmentVariableA')
Errare humanum est, stultum est in errore perseverare
			
						- Дед Пахом
 - Старичок
 - Сообщения: 3346
 - Зарегистрирован: 07 Июль 2005, 16:51
 - Откуда: Москва, Россия
 - Благодарил (а): 20 раз
 - Поблагодарили: 56 раз
 - Контактная информация:
 
Re: Как получить значение системной перменной?
С какой радости звёздочка? Прототип 
nSize - длина lpBuffer, его надо указать при вызове.
			
			
									
						Код: Выделить всё
DWORD WINAPI GetEnvironmentVariable(
  __in_opt   LPCTSTR lpName,
  __out_opt  LPTSTR lpBuffer,
  __in       DWORD nSize
);
С уважением, ДП
			
						- 
				Juffin
 - Новичок
 - Сообщения: 19
 - Зарегистрирован: 01 Сентябрь 2005, 13:18
 - Откуда: Saint-Petersburg, Russia
 
Re: Как получить значение системной перменной?
У меня Клара 6.3 (59). Без звездочки не работает вообще. Возвращает пустую строку. Со звездочкой работает железно.
			
			
									
						Errare humanum est, stultum est in errore perseverare
			
						- Дед Пахом
 - Старичок
 - Сообщения: 3346
 - Зарегистрирован: 07 Июль 2005, 16:51
 - Откуда: Москва, Россия
 - Благодарил (а): 20 раз
 - Поблагодарили: 56 раз
 - Контактная информация:
 
Re: Как получить значение системной перменной?
Со звёздочкой в GetEnvironmentVariable передаётся адрес переменной, который функция трактует как размер буфера. Слава богу, что макс. размер может быть 32кб ;^)
			
			
									
						С уважением, ДП
			
						- 
				NewUser
 - Старожил
 - Сообщения: 238
 - Зарегистрирован: 10 Ноябрь 2005, 23:07
 - Откуда: Краснодар
 - Благодарил (а): 6 раз
 
Re: Как получить значение системной перменной?
Здравствуйте!
В чем ошибка?
В %GlobalMap:
MODULE('Windows.dll')
GetEnvironmentVar(*CSTRING,*CSTRING,*ULONG),ULONG,PASCAL,RAW,NAME('GetEnvironmentVariableA')
END
В нужном месте:
loc:ParamCstring = '%AppData%'
loc:Ulong = 1024
error# = GetEnvironmentVar(loc:ParamCstring,loc:CString,loc:Ulong)
Message(loc:CString) - выдает вселеннскую пустоту. Хоть
			
			
									
						В чем ошибка?
В %GlobalMap:
MODULE('Windows.dll')
GetEnvironmentVar(*CSTRING,*CSTRING,*ULONG),ULONG,PASCAL,RAW,NAME('GetEnvironmentVariableA')
END
В нужном месте:
loc:ParamCstring = '%AppData%'
loc:Ulong = 1024
error# = GetEnvironmentVar(loc:ParamCstring,loc:CString,loc:Ulong)
Message(loc:CString) - выдает вселеннскую пустоту. Хоть
- Дед Пахом
 - Старичок
 - Сообщения: 3346
 - Зарегистрирован: 07 Июль 2005, 16:51
 - Откуда: Москва, Россия
 - Благодарил (а): 20 раз
 - Поблагодарили: 56 раз
 - Контактная информация:
 
Re: Как получить значение системной перменной?
loc:ParamCstring = 'AppData'. И третья звёздочка в прототипе GetEnvironmentVar не нужна.NewUser писал(а):loc:ParamCstring = '%AppData%'
С уважением, ДП
			
						- 
				NewUser
 - Старожил
 - Сообщения: 238
 - Зарегистрирован: 10 Ноябрь 2005, 23:07
 - Откуда: Краснодар
 - Благодарил (а): 6 раз
 
Re: Как получить значение системной перменной?
И со звездочкой не работало и без нее...
Все дело, как оказалось, в процентах.
Фу, спасибо, выручили!
			
			
									
						Все дело, как оказалось, в процентах.
Фу, спасибо, выручили!
- 
				NewUser
 - Старожил
 - Сообщения: 238
 - Зарегистрирован: 10 Ноябрь 2005, 23:07
 - Откуда: Краснодар
 - Благодарил (а): 6 раз
 
Re: Как получить значение системной перменной?
Рано радовался.
Почему-то при выше приведенном варианте результат воводится в формате:
C:\Docume~1\%UserName%\Applic~1, как будто использовалась перменная %ShortAppData%
В чем дело?
			
			
									
						Почему-то при выше приведенном варианте результат воводится в формате:
C:\Docume~1\%UserName%\Applic~1, как будто использовалась перменная %ShortAppData%
В чем дело?
- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
Re: Как получить значение системной перменной?
Привет всем ! Как-то я эту ветку форума прозевал, однако ...
Анализировать системные переменные можно, но только ради спортивного интереса. Или для прикола.
Как мудро написал Дед Пахом ниже - программа может и должна получать все данные о папках Windows
напрямую через WinApi (можно еще читать ветки реестра, но это скользкий путь, от версии к версии Windows
меняется наименование разделов, видов папок и т.д.)
Конкретно для Clarion.
1. Объявляем в Global Map
Module('Windows')
SHGetSpecialFolderPath(UNSIGNED,*CSTRING,Ushort,byte),Long,PASCAL,RAW,NAME('SHGetSpecialFolderPathA')
end
В С6 нужно добавить этот метод в win32.lib или прилинковать отдельным файлом, в C7 уже все работает.
2. Читаем, например папку USER\Local Setings\AppData\
Loc:FPath CString(260)
Code
If SHGetSpecialFolderPath(0,Loc:FPath,28,True) then Message(Loc:FPath).
3. Все. Все варианты получения папок Windows смотрим в MSDN, ну или как обычно у дельфистов ...
http://msdn.microsoft.com/en-us/library ... S.85).aspx
http://msdn.microsoft.com/en-us/library ... S.85).aspx
http://kurkov.biz/kak-uznat-puti-k-stan ... kam-delphi
4. И я Вас умоляю - не придумывайте проблем с которыми надо так долго бодаться ...
			
			
									
						Анализировать системные переменные можно, но только ради спортивного интереса. Или для прикола.
Как мудро написал Дед Пахом ниже - программа может и должна получать все данные о папках Windows
напрямую через WinApi (можно еще читать ветки реестра, но это скользкий путь, от версии к версии Windows
меняется наименование разделов, видов папок и т.д.)
Конкретно для Clarion.
1. Объявляем в Global Map
Module('Windows')
SHGetSpecialFolderPath(UNSIGNED,*CSTRING,Ushort,byte),Long,PASCAL,RAW,NAME('SHGetSpecialFolderPathA')
end
В С6 нужно добавить этот метод в win32.lib или прилинковать отдельным файлом, в C7 уже все работает.
2. Читаем, например папку USER\Local Setings\AppData\
Loc:FPath CString(260)
Code
If SHGetSpecialFolderPath(0,Loc:FPath,28,True) then Message(Loc:FPath).
3. Все. Все варианты получения папок Windows смотрим в MSDN, ну или как обычно у дельфистов ...
http://msdn.microsoft.com/en-us/library ... S.85).aspx
http://msdn.microsoft.com/en-us/library ... S.85).aspx
http://kurkov.biz/kak-uznat-puti-k-stan ... kam-delphi
4. И я Вас умоляю - не придумывайте проблем с которыми надо так долго бодаться ...
За теми, кто отстал, не возвращаться ! 
 Кодекс
			
						- 
				NewUser
 - Старожил
 - Сообщения: 238
 - Зарегистрирован: 10 Ноябрь 2005, 23:07
 - Откуда: Краснодар
 - Благодарил (а): 6 раз
 
Re: Как получить значение системной перменной?
Здравствуйте, Игорь!
Почему это анализировать системные переменные можно только ради спортивного интереса или прикола?
В моем случае нужно поместить данные программы в папку, рекомендуемую Windows’ом для их хранения.
Для этого я, собственно, и пытаюсь получить этот путь.
И хотя GetEnvironmentVar путь находится и с ним можно реально работать, только вот в Message’ах он выводится не совсем корректно, как будто была запрошена вместо %AppData% %ShortAppData%.
Ну и самое главное. Прошу помощи в понимании как реализовать пошажно:
«добавить этот метод в win32.lib»
«прилинковать отдельным файлом»
Спасибо!
			
			
									
						Почему это анализировать системные переменные можно только ради спортивного интереса или прикола?
В моем случае нужно поместить данные программы в папку, рекомендуемую Windows’ом для их хранения.
Для этого я, собственно, и пытаюсь получить этот путь.
И хотя GetEnvironmentVar путь находится и с ним можно реально работать, только вот в Message’ах он выводится не совсем корректно, как будто была запрошена вместо %AppData% %ShortAppData%.
Ну и самое главное. Прошу помощи в понимании как реализовать пошажно:
«добавить этот метод в win32.lib»
«прилинковать отдельным файлом»
Спасибо!
