Как получить значение системной перменной?

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
jura
Новичок
Сообщения: 16
Зарегистрирован: 08 Июль 2005, 5:42
Откуда: Ulan-Ude

Как получить значение системной перменной?

Сообщение jura »

Собственно subj
в частности %UserProfile%

с уважением jura
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Сообщение 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, ...);
}

Аватара пользователя
Admin
Администратор
Сообщения: 3963
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 29 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение Admin »

Для переменных окружения юзай GetEnvironmentVariable
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Как получить значение системной перменной?

Сообщение Yufil »

jura писал(а):Собственно subj
в частности %UserProfile%

с уважением jura
GetEnvironmentVar(*CSTRING,*CSTRING,ULONG),ULONG,PASCAL,RAW,NAME('GetEnvironmentVariableA')
Первый параметр - наименование переменной
Второй - куда класть
Третий - максимальная длина
jura
Новичок
Сообщения: 16
Зарегистрирован: 08 Июль 2005, 5:42
Откуда: Ulan-Ude

Сообщение jura »

Сенкс - все работает отлично!

С уважением jura.
Juffin
Новичок
Сообщения: 19
Зарегистрирован: 01 Сентябрь 2005, 13:18
Откуда: Saint-Petersburg, Russia

Re: Как получить значение системной перменной?

Сообщение Juffin »

GetEnvironmentVar(*CSTRING,*CSTRING,ULONG),ULONG,PASCAL,RAW,NAME('GetEnvironmentVariableA')
А что звездочку перед ULONG забыл?
Правильнее так - 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: Как получить значение системной перменной?

Сообщение Дед Пахом »

С какой радости звёздочка? Прототип

Код: Выделить всё

DWORD WINAPI GetEnvironmentVariable(
  __in_opt   LPCTSTR lpName,
  __out_opt  LPTSTR lpBuffer,
  __in       DWORD nSize
);

nSize - длина lpBuffer, его надо указать при вызове.
С уважением, ДП
Juffin
Новичок
Сообщения: 19
Зарегистрирован: 01 Сентябрь 2005, 13:18
Откуда: Saint-Petersburg, Russia

Re: Как получить значение системной перменной?

Сообщение Juffin »

У меня Клара 6.3 (59). Без звездочки не работает вообще. Возвращает пустую строку. Со звездочкой работает железно.
Errare humanum est, stultum est in errore perseverare
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3143
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 11 раз
Поблагодарили: 32 раза
Контактная информация:

Re: Как получить значение системной перменной?

Сообщение Дед Пахом »

Со звёздочкой в GetEnvironmentVariable передаётся адрес переменной, который функция трактует как размер буфера. Слава богу, что макс. размер может быть 32кб ;^)
С уважением, ДП
NewUser
Старожил
Сообщения: 226
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 4 раза

Re: Как получить значение системной перменной?

Сообщение 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) - выдает вселеннскую пустоту. Хоть :(
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3143
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 11 раз
Поблагодарили: 32 раза
Контактная информация:

Re: Как получить значение системной перменной?

Сообщение Дед Пахом »

NewUser писал(а):loc:ParamCstring = '%AppData%'
loc:ParamCstring = 'AppData'. И третья звёздочка в прототипе GetEnvironmentVar не нужна.
С уважением, ДП
NewUser
Старожил
Сообщения: 226
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 4 раза

Re: Как получить значение системной перменной?

Сообщение NewUser »

И со звездочкой не работало и без нее...
Все дело, как оказалось, в процентах.
Фу, спасибо, выручили!
NewUser
Старожил
Сообщения: 226
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 4 раза

Re: Как получить значение системной перменной?

Сообщение NewUser »

Рано радовался.
Почему-то при выше приведенном варианте результат воводится в формате:
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. И я Вас умоляю - не придумывайте проблем с которыми надо так долго бодаться ... :)
За теми кто отстал - не возвращаться. (С) Кодекс
NewUser
Старожил
Сообщения: 226
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 4 раза

Re: Как получить значение системной перменной?

Сообщение NewUser »

Здравствуйте, Игорь!
Почему это анализировать системные переменные можно только ради спортивного интереса или прикола?
В моем случае нужно поместить данные программы в папку, рекомендуемую Windows’ом для их хранения.
Для этого я, собственно, и пытаюсь получить этот путь.
И хотя GetEnvironmentVar путь находится и с ним можно реально работать, только вот в Message’ах он выводится не совсем корректно, как будто была запрошена вместо %AppData% %ShortAppData%.

Ну и самое главное. Прошу помощи в понимании как реализовать пошажно:
«добавить этот метод в win32.lib»
«прилинковать отдельным файлом»
Спасибо!
Ответить