Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.18;
Скачать: CL | DM;

Вниз

GetShortPathName   Найти похожие ветки 

 
Anonim   (2006-03-20 22:49) [0]

Помогите разобраться. Не пойму, с чем неправильно работаю: с функцией или с передаваемыми типами данных.
---
procedure TForm1.Button1Click(Sender: TObject);
var lp,sp:PAnsiChar;
a:Cardinal;
begin
lp:=PAnsiChar(edit1.Text);
a:=GetShortPathNameA(lp,sp,255);
label1.Caption:=sp;
end;
Понятно, что я хочу получить дос-путь.


 
Джо ©   (2006-03-20 22:53) [1]


> Не пойму, с чем неправильно работаю: с функцией или с передаваемыми
> типами данных.

Память под sp не выделена.


 
Ihor Osov'yak ©   (2006-03-20 22:58) [2]

посмотрите внимательно мсдн на предмет GetShortPathName и Вы поймете, что абсолютно некоректно работаете с параметрами..

вариант второй. С очень высой долей вероятности можно предположить, что эту апишную функцию борлад использует где-то в своих библиотеках, следовательно можно сделать поиск по исходникам.
У меня було время и немного желания, и секунд через 15 в sysunits.pas
нашел вот такую вещь

function ExtractShortPathName(const FileName: string): string;
var
 Buffer: array[0..MAX_PATH - 1] of Char;
begin
 SetString(Result, Buffer,
   GetShortPathName(PChar(FileName), Buffer, SizeOf(Buffer)));
end;

Надеюсь, с нее все понятно.

Также обратите внимание, что используется GetShortPathName а не GetShortPathNameA..


 
Anonim   (2006-03-20 23:11) [3]


> Также обратите внимание, что используется GetShortPathName
> а не GetShortPathNameA..

Я использовал и GetShortPathName, и GetShortPathNameA - эффект одинаковый. А за ExtractShortPathName огромное спасибо. Отлично работает!!!


 
Piter ©   (2006-03-20 23:17) [4]

А я вот думаю, что эффективнее - выделять MAX_PATH, а потом обрезать строку,  или сначала вызывать GetShortPathName, чтобы узнать нужный размер буфера, выделять его и вызывать повторно...


 
Ihor Osov'yak ©   (2006-03-20 23:21) [5]

> GetShortPathName, и GetShortPathNameA - эффект одинаковый

само собою, это для случая делфи синонимы, но в общем случае - не обязательно, прочтите на досуге какую-то белетристику об юникод- и анси- версиях программ...
Если же нет желания/возможности/времени разбираться - то просто следуйте простому правилу - используйте функции без окончаний A..
Хуже от этого не будет (в 99.9999 проц. случаев), а вот иногда (за пределами мира делфи) может быть и выиграш..


 
Ihor Osov'yak ©   (2006-03-20 23:26) [6]

2 Piter,

эфективнее так, как сделал борлад -  буфер размещается статически - и никакой головомойки с выделением-освобождением памяти для промежуточного буфера.
а при формировании результата - стандартные накладные расходы для случая результата - строки.


 
Ihor Osov'yak ©   (2006-03-20 23:27) [7]

сори за опечатку двойную в имени уважаемой фирмы.


 
GuAV ©   (2006-03-21 02:01) [8]

Подозреваю, что

> выделять MAX_PATH, а потом обрезать строку

м.б. эффективнее чем

> буфер размещается статически

, если обрезание строки не приведёт к перераспределнию памяти, т.к. в этом случае всё то же самое но без копривоания строки


 
Ihor Osov'yak ©   (2006-03-21 04:52) [9]

2 GuAV
> Подозреваю, что
>> выделять MAX_PATH, а потом обрезать строку
>м.б. эффективнее чем
>> буфер размещается статически

Нет. Но для начала - вообще-то справедливости ради - в примере кода от Борланда буфер все же не статически, а в стеке. Извиняюсь, за небольшую путаницу, привнесенную мною.
Но. и в слоучае статического размещения буффера, и в случае размещения  буфера в стеке код будет эффективнее, чем дин. распределение буфера. Хотя бы потому, что отсутсвует обращение к менеджеру памяти (запрос на выделение памяти и с последующим освобождением), да и адресация более простая, а не поинтеру. В случае размещения буф. в стеке никаких дополнительных затрат на операцию выделения памяти не происходит, если есть хотя бы одна локальная переменная, если нет - то одна комманда типа sub esp, size_buf; если же статически - то "расппределение"   еще на уровне загрузки приложения, тоже без дополнительных накладных затрат..
Ну а в части возврещения результата вышеупомянутые варианты практически равноправны - по любому придется динамически распределять ansi-string для результата, и копировать в тело этой строки содержимое буфера.



Страницы: 1 вся ветка

Текущий архив: 2006.06.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.044 c
1-1147212202
Германн
2006-05-10 02:03
2006.06.18
TListView


15-1148418317
Andy BitOff
2006-05-24 01:05
2006.06.18
Новый вирус, Уязвимость в Microsoft Word.


15-1148274904
Александр Иванов
2006-05-22 09:15
2006.06.18
Сумма прописью


2-1148878790
graf
2006-05-29 08:59
2006.06.18
Работа с FTP


11-1128926014
E1
2005-10-10 10:33
2006.06.18
почему у ListBox не работает событие OnClick