Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.02 c
1-1147086844
yahaha
2006-05-08 15:14
2006.06.18
Отловить события (TWebbrowser)


1-1147540799
deltav1
2006-05-13 21:19
2006.06.18
Параллелизм и время


15-1148273694
Ega23
2006-05-22 08:54
2006.06.18
С Днём рождения! 22 мая (настоящее)


2-1148977859
alec_sey
2006-05-30 12:30
2006.06.18
Шифрование файлов


3-1145602125
daimyo
2006-04-21 10:48
2006.06.18
DBGrid получение имени колонки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский