Форум: "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