Как получить значение системной перменной?
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Как получить значение системной перменной?
Собственно subj
в частности %UserProfile%
с уважением jura
в частности %UserProfile%
с уважением jura
- StillZero
- Ветеран
- Сообщения: 454
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Контактная информация:
сам не пробовал
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
Первый параметр - наименование переменной
Второй - куда класть
Третий - максимальная длина
-
- Новичок
- Сообщения: 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
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
Re: Как получить значение системной перменной?
С какой радости звёздочка? Прототип
nSize - длина lpBuffer, его надо указать при вызове.
Код: Выделить всё
DWORD WINAPI GetEnvironmentVariable(
__in_opt LPCTSTR lpName,
__out_opt LPTSTR lpBuffer,
__in DWORD nSize
);
С уважением, ДП
-
- Новичок
- Сообщения: 19
- Зарегистрирован: 01 Сентябрь 2005, 13:18
- Откуда: Saint-Petersburg, Russia
Re: Как получить значение системной перменной?
У меня Клара 6.3 (59). Без звездочки не работает вообще. Возвращает пустую строку. Со звездочкой работает железно.
Errare humanum est, stultum est in errore perseverare
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
Re: Как получить значение системной перменной?
Со звёздочкой в GetEnvironmentVariable передаётся адрес переменной, который функция трактует как размер буфера. Слава богу, что макс. размер может быть 32кб ;^)
С уважением, ДП
-
- Старожил
- Сообщения: 226
- Зарегистрирован: 10 Ноябрь 2005, 23:07
- Откуда: Краснодар
- Благодарил (а): 4 раза
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) - выдает вселеннскую пустоту. Хоть
- Дед Пахом
- Старичок
- Сообщения: 3143
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
Re: Как получить значение системной перменной?
loc:ParamCstring = 'AppData'. И третья звёздочка в прототипе GetEnvironmentVar не нужна.NewUser писал(а):loc:ParamCstring = '%AppData%'
С уважением, ДП
-
- Старожил
- Сообщения: 226
- Зарегистрирован: 10 Ноябрь 2005, 23:07
- Откуда: Краснодар
- Благодарил (а): 4 раза
Re: Как получить значение системной перменной?
И со звездочкой не работало и без нее...
Все дело, как оказалось, в процентах.
Фу, спасибо, выручили!
Все дело, как оказалось, в процентах.
Фу, спасибо, выручили!
-
- Старожил
- Сообщения: 226
- Зарегистрирован: 10 Ноябрь 2005, 23:07
- Откуда: Краснодар
- Благодарил (а): 4 раза
Re: Как получить значение системной перменной?
Рано радовался.
Почему-то при выше приведенном варианте результат воводится в формате:
C:\Docume~1\%UserName%\Applic~1, как будто использовалась перменная %ShortAppData%
В чем дело?
Почему-то при выше приведенном варианте результат воводится в формате:
C:\Docume~1\%UserName%\Applic~1, как будто использовалась перменная %ShortAppData%
В чем дело?
- Игорь Столяров
- Ветеран движения
- Сообщения: 7447
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
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. И я Вас умоляю - не придумывайте проблем с которыми надо так долго бодаться ...
За теми кто отстал - не возвращаться. (С) Кодекс
-
- Старожил
- Сообщения: 226
- Зарегистрирован: 10 Ноябрь 2005, 23:07
- Откуда: Краснодар
- Благодарил (а): 4 раза
Re: Как получить значение системной перменной?
Здравствуйте, Игорь!
Почему это анализировать системные переменные можно только ради спортивного интереса или прикола?
В моем случае нужно поместить данные программы в папку, рекомендуемую Windows’ом для их хранения.
Для этого я, собственно, и пытаюсь получить этот путь.
И хотя GetEnvironmentVar путь находится и с ним можно реально работать, только вот в Message’ах он выводится не совсем корректно, как будто была запрошена вместо %AppData% %ShortAppData%.
Ну и самое главное. Прошу помощи в понимании как реализовать пошажно:
«добавить этот метод в win32.lib»
«прилинковать отдельным файлом»
Спасибо!
Почему это анализировать системные переменные можно только ради спортивного интереса или прикола?
В моем случае нужно поместить данные программы в папку, рекомендуемую Windows’ом для их хранения.
Для этого я, собственно, и пытаюсь получить этот путь.
И хотя GetEnvironmentVar путь находится и с ним можно реально работать, только вот в Message’ах он выводится не совсем корректно, как будто была запрошена вместо %AppData% %ShortAppData%.
Ну и самое главное. Прошу помощи в понимании как реализовать пошажно:
«добавить этот метод в win32.lib»
«прилинковать отдельным файлом»
Спасибо!