Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Переменные среды в Delphi


Страницы:   1 2

programmer90 ©   (2008-09-11 22:54:00) 

Добрый вечер!
Как узнать системный диск(букву тома), а также системную директорию  и дркгие переменные среды?
Спасибо.


Германн   (2008-09-13 01:35:00) [1]


> KygECHuK ©   (12.09.08 10:03) [30]
>
> Или так
> ExtractShortPathName в sysUtils.... :p
>

Ну это для совсем лентяев. :)


Virgo_Style   (2008-09-12 23:36:00) [2]

programmer90   (12.09.08 18:41) [32]
разрабатывается оптимальный код


это теперь так называется


programmer90   (2008-09-12 18:41:00) [3]


> KilkennyCat ©  
Германн ©  
palva ©

В спорах рождается истина...и разрабатывается оптимальный код)
Большое спасибо всем!


ЛшдлуттнСфе   (2008-09-12 10:08:00) [4]

вау. :)


KygECHuK   (2008-09-12 10:03:00) [5]

Или так
ExtractShortPathName в sysUtils.... :p


KilkennyCat   (2008-09-12 09:53:00) [6]

наверное, можно и еще короче:
function shortname(const ins : string) : string;
var
 outs : array [0..255] of char;
begin;
 if GetShortPathName(pchar(ins), outs, sizeof(outs)) = 0 then result := "error" else result := strpas(outs);
end;


тоже не проверял


palva   (2008-09-12 09:26:00) [7]


> KilkennyCat ©   (12.09.08 01:19) [23]

Можно не заводить буфер и не выделять память, а писать прямо в строку.
var
ins, outs: string;
leng : word;

leng = GetShortPathName(pchar(ins), nil, 0);
if leng = 0 then error-exit;

SetLength (outs, leng);
GetShortPathName(pchar(ins), outs, leng);


(Код не проверял)


Германн   (2008-09-12 01:51:00) [8]


> KilkennyCat ©   (12.09.08 01:31) [26]
>
> а нужен ли терминатор в данном случае?
> и зачем обнулять, если я уверен в  полном заполнении?
>

Так он же (buff) всё таки PChar. И как с ним потом нормально работать если нет терминирующего ноля? Просто как с массивом символов?
Да и справка вроде недвусмысленно говорит lpszShortPath
Points to a buffer to receive the null-terminated short form of the path specified by lpszLongPath.

Вот насчёт обнуления тут я может и не прав.


KilkennyCat   (2008-09-12 01:31:00) [9]

а нужен ли терминатор в данном случае?
и зачем обнулять, если я уверен в  полном заполнении?


Германн   (2008-09-12 01:27:00) [10]


> KilkennyCat ©   (12.09.08 01:19) [23]

Костя, ты уж извини, но  GetShortPathName(pchar(ins), buff, leng +1);
ибо "return value is the length, in characters, of the string copied to lpszShortPath, not including the terminating null character." Да и буфер лучше обнулить до передачи его в качестве параметра.


Германн   (2008-09-12 01:20:00) [11]


> programmer90   (12.09.08 01:15) [22]
>
> Спасибки,  завтра посмотрим.

Ну-ну. Завтра увидим. :)


KilkennyCat   (2008-09-12 01:19:00) [12]

var
 ins, outs: string;
 buff: PChar;
 leng : word;

 leng = GetShortPathName(pchar(ins), nil, 0);
 if leng = 0 then error-exit;

 GetMem (buff, leng);
 leng = GetShortPathName(pchar(ins), buff, leng);
 if leng = 0 then error-exit;

 

и не забудть освободить выделенную память под буфер


programmer90   (2008-09-12 01:15:00) [13]

Спасибки,  завтра посмотрим.
я уже в браузере вместо f5   f9 нажимаю....


Германн   (2008-09-12 01:12:00) [14]


> KilkennyCat ©   (12.09.08 01:08) [16]
>
>
> > for i := 1 to 1000 do
> >      GetShortPathName(Pchar(teststr),Pchar(Edit2.text),
> i);
> >
> > эффекта нет:(
>
> я бы заметил, что эффекта не было аж 1000 раз....
>

У меня эффект в тестовом проекте был сразу и всегда.
Invalid pointer operation.


programmer90   (2008-09-12 01:12:00) [15]


> Когда-то давно, я учился разрабатывать игры по книжке одного
> французкого автора, жаль, забыл имя - хорошая книжка...
> так вот, там предлагался сценарий игры:Есть планета шадоков
> и планета гибиков. Шадоки строят долго и упорно ракету,
> просчитывают ее, испытания делают.. вообщем, по науке. Гибикам
> тож надо выйти в космос, ибо у них с шадоками типа холодной
> войны. Великий колдун гибиков предсказал, что тысячная ракета
> обязательно взлетит. Поэтому гибики начали из всякой дряни
> строить первые 999 ракет, им был пофиг результат, главное,
>  чтоб быстрее добраться до тысячной.

ппц)))))))


programmer90   (2008-09-12 01:10:00) [16]


>   length = GetShortPathName(lpszPath, NULL, 0);    if (length
> == 0) ErrorExit(TEXT("GetShortPathName"));и затем уже получать
> требуемый результат:    buffer = new TCHAR[length];    length
> = GetShortPathName(lpszPath, buffer, length);    if (length
> == 0) ErrorExit(TEXT("GetShortPathName"));

Это с++?
Что бы то ни было  чертовски непонятно)


KilkennyCat   (2008-09-12 01:09:00) [17]


> Германн ©   (12.09.08 00:56) [13]

спасибо за поправку. Я просто хотел проще, но согласен, исказил суть.


Германн   (2008-09-12 01:08:00) [18]


> Pchar(Edit2.text)

Хороший буфер для приёма данных! :)
Кто ж тебя так учил ? Разве WinAPI функции умеют работать со свойствами VCL компонентов?


KilkennyCat   (2008-09-12 01:08:00) [19]


> for i := 1 to 1000 do
>      GetShortPathName(Pchar(teststr),Pchar(Edit2.text),i);
>
> эффекта нет:(

я бы заметил, что эффекта не было аж 1000 раз....

Когда-то давно, я учился разрабатывать игры по книжке одного французкого автора, жаль, забыл имя - хорошая книжка... так вот, там предлагался сценарий игры:
Есть планета шадоков и планета гибиков. Шадоки строят долго и упорно ракету, просчитывают ее, испытания делают.. вообщем, по науке. Гибикам тож надо выйти в космос, ибо у них с шадоками типа холодной войны. Великий колдун гибиков предсказал, что тысячная ракета обязательно взлетит. Поэтому гибики начали из всякой дряни строить первые 999 ракет, им был пофиг результат, главное, чтоб быстрее добраться до тысячной.


KilkennyCat   (2008-09-12 00:58:00) [20]

я же указал ссылку на справку.
микрософт рекомендует вначале узнать длину возвращаемого результата, что заодно и проверяет на ошибку:
  length = GetShortPathName(lpszPath, NULL, 0);
   if (length == 0) ErrorExit(TEXT("GetShortPathName"));


и затем уже получать требуемый результат:
    buffer = new TCHAR[length];
   length = GetShortPathName(lpszPath, buffer, length);
   if (length == 0) ErrorExit(TEXT("GetShortPathName"));


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо