Страница 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»
«прилинковать отдельным файлом»
Спасибо!