Страница 1 из 2
					
				Как получить значение системной перменной?
				Добавлено: 22 Ноябрь 2006, 6:34
				 jura
				Собственно subj
в частности %UserProfile%
с уважением jura
			 
			
					
				
				Добавлено: 22 Ноябрь 2006, 9:43
				 StillZero
				сам не пробовал
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, ...);
}
 
			 
			
					
				
				Добавлено: 22 Ноябрь 2006, 11:00
				 Admin
				Для переменных окружения юзай GetEnvironmentVariable
			 
			
					
				Re: Как получить значение системной перменной?
				Добавлено: 22 Ноябрь 2006, 11:36
				 Yufil
				jura писал(а):Собственно subj
в частности %UserProfile%
с уважением jura
            GetEnvironmentVar(*CSTRING,*CSTRING,ULONG),ULONG,PASCAL,RAW,NAME('GetEnvironmentVariableA')
Первый параметр - наименование переменной 
Второй - куда класть 
Третий - максимальная длина
 
			 
			
					
				
				Добавлено: 23 Ноябрь 2006, 4:13
				 jura
				Сенкс - все работает отлично!
С уважением jura.
			 
			
					
				Re: Как получить значение системной перменной?
				Добавлено: 26 Декабрь 2008, 11:07
				 Juffin
				GetEnvironmentVar(*CSTRING,*CSTRING,ULONG),ULONG,PASCAL,RAW,NAME('GetEnvironmentVariableA')
А что звездочку перед ULONG забыл?
Правильнее так - GetEnvironmentVar(*CSTRING,*CSTRING,*ULONG),ULONG,PASCAL,RAW,NAME('GetEnvironmentVariableA')
 
			 
			
					
				Re: Как получить значение системной перменной?
				Добавлено: 26 Декабрь 2008, 13:21
				 Дед Пахом
				С какой радости звёздочка? Прототип 
Код: Выделить всё
DWORD WINAPI GetEnvironmentVariable(
  __in_opt   LPCTSTR lpName,
  __out_opt  LPTSTR lpBuffer,
  __in       DWORD nSize
);
nSize - длина lpBuffer, его надо указать при вызове.
 
			 
			
					
				Re: Как получить значение системной перменной?
				Добавлено: 26 Декабрь 2008, 14:24
				 Juffin
				У меня Клара 6.3 (59). Без звездочки не работает вообще. Возвращает пустую строку. Со звездочкой работает железно.
			 
			
					
				Re: Как получить значение системной перменной?
				Добавлено: 26 Декабрь 2008, 14:40
				 Дед Пахом
				Со звёздочкой в GetEnvironmentVariable передаётся адрес переменной, который функция трактует как размер буфера. Слава богу, что макс. размер может быть 32кб ;^)
			 
			
					
				Re: Как получить значение системной перменной?
				Добавлено: 27 Апрель 2011, 12:00
				 NewUser
				Здравствуйте!
В чем ошибка?
В %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) - выдает вселеннскую пустоту. Хоть  

 
			 
			
					
				Re: Как получить значение системной перменной?
				Добавлено: 27 Апрель 2011, 14:12
				 Дед Пахом
				NewUser писал(а):loc:ParamCstring = '%AppData%'
loc:ParamCstring = 'AppData'. И третья звёздочка в прототипе GetEnvironmentVar не нужна.
 
			 
			
					
				Re: Как получить значение системной перменной?
				Добавлено: 27 Апрель 2011, 14:31
				 NewUser
				И со звездочкой не работало и без нее...
Все дело, как оказалось, в процентах.
Фу, спасибо, выручили!
			 
			
					
				Re: Как получить значение системной перменной?
				Добавлено: 27 Апрель 2011, 14:43
				 NewUser
				Рано радовался.
Почему-то при выше приведенном варианте результат воводится в формате:
 C:\Docume~1\%UserName%\Applic~1, как будто использовалась перменная %ShortAppData%
В чем дело?
			 
			
					
				Re: Как получить значение системной перменной?
				Добавлено: 27 Апрель 2011, 22:31
				 Игорь Столяров
				Привет всем ! Как-то я эту ветку форума прозевал, однако ...
Анализировать системные переменные можно, но только ради спортивного интереса. Или для прикола.
Как мудро написал Дед Пахом ниже - программа может и должна получать все данные о папках 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. И я Вас умоляю - не придумывайте проблем с которыми надо так долго бодаться ... 

 
			 
			
					
				Re: Как получить значение системной перменной?
				Добавлено: 29 Апрель 2011, 9:34
				 NewUser
				Здравствуйте, Игорь!
Почему это анализировать системные переменные можно только ради спортивного интереса или прикола?
В моем случае нужно поместить данные программы в папку, рекомендуемую Windows’ом для их хранения.
Для этого я, собственно, и пытаюсь получить этот путь.
И хотя GetEnvironmentVar путь находится и с ним можно реально работать, только вот в Message’ах он выводится не совсем корректно, как будто была запрошена вместо %AppData% %ShortAppData%.
Ну и самое главное. Прошу помощи в понимании как реализовать пошажно:
«добавить этот метод в win32.lib»
«прилинковать отдельным файлом»
Спасибо!