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

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

Работа с PChar средствами Windows (API) [D2005, XP]


Страницы:   1 2 3

Max_2006 ©   (2006-11-05 12:38:00) 

как работать с PChar в Delphi средствами Windows, т.е. API? Т.е. надо например воспользоваться API функцией GetSystemDirectory, что делать если после ее выполнения нужно выполнить что-то вроде SetLength(p, Length(p)); т.е. длина строки ранв MAX_PATH, после выполнения функции GetSystemDirectory, как обрезать строку?

var
 p: PChar
begin
 GetMem(p, MAX_PATH);
 GetSystemDirectory(p, MAX_PATH);

...
 FreeMem(p);

Работу со String и ShortString не предлагайте...


Германн   (2006-11-06 02:09:00) [1]


> Я просто где-то видел что @S[1] так лучше, или это не так?

:-)


Max_2006   (2006-11-06 00:17:00) [2]

Я буду со строками работать, просто интересно стало это насчет массива...


Anatoly Podgoretsky   (2006-11-06 00:08:00) [3]

> Ketmar  (05.11.2006 23:00:41)  [41]
Затем, что мы простых путей не ищем.


Anatoly Podgoretsky   (2006-11-05 23:59:00) [4]

> Max_2006  (05.11.2006 22:45:40)  [40]
Используй строки, их элементарно расширять и сжимать

-


Ketmar   (2006-11-05 23:00:00) [5]

а зачем???


Max_2006   (2006-11-05 22:45:00) [6]

А если нужно расширить массив? т.е. есть массив array [0..20] of Char и он весь занят и его надо расширить, то всеравно надо создавать новый и делать move?


Max_2006   (2006-11-05 22:23:00) [7]


> Никаких копирований ВинАПИ не делает.

А я вообще про строку имел ввиду...


Anatoly Podgoretsky   (2006-11-05 20:10:00) [8]

> Max_2006  (05.11.2006 18:10:34)  [34]

Никаких копирований ВинАПИ не делает.


Leonid Troyanovsky   (2006-11-05 18:34:00) [9]


> Max_2006   (05.11.06 17:50) [32]

> Я тут еще так подумал, может string передавать в функцию
> требующая PChar так: Pointer(str)? или всеже лучше PChar(str)?

From Delphi help: Long string types:

It is also possible to typecast a long string to an untyped pointer, using the
syntax Pointer(S), where S is a long string expression. A Pointer typecast
returns the address of the first character of the long string value. Unlike a PChar
typecast, a Pointer typecast returns nil if the string expression is empty.

--
Regards, LVT.


sniknik   (2006-11-05 18:24:00) [10]

> Т.е. быстрее чем приложение написанное на C++???
очень часто да быстрее, и намного (очень намного). имею под боком трех С-шников, есть прецеденты.

> Все же я не очень понимаю чем string выигрывает по скорости массив array [0..MAX_PATH] of Char
массиву ничем, для доступа, для копирования - не придётся узнавать размер строки, копирование можно сделать одной ассемблерной командой, в случае массива (вернее z терминированной строки) чтобы узнать размер придётся ее сканировать, или если делать условие на конечный 0 прям в копировании то все одно придётся делать циклом, кучей команд переноса и проверкой в цикле на 0... одна команда на все копирование 2 такта (примерно естественно), против кучи на каждый перенесённый байт и проверку, на все те же 2 такта... на каждую команду... считай. а лучше читай, найди чего нибудь для начинающих и просто выучи наизусть (по другому видно не доходит).


Ketmar   (2006-11-05 18:22:00) [11]

>[34] Max_2006 5-Nov-2006, 18:10
один фиг.


Max_2006   (2006-11-05 18:10:00) [12]

Все же я не очень понимаю чем string выигрывает по скорости массив array [0..MAX_PATH] of Char, если выполнять с массивом какиенибудь действия то его придется копировать в новую память и т.д. А как тогда устроен string, я понимаю что по сути дела это только указатель, но а если строка все больше и больше становится, растет так сказать, то по идее память должна как-то динамически увеличиваться или как? Если динамически то на это тоже не мало времени тратится...


Anatoly Podgoretsky   (2006-11-05 17:57:00) [13]

> Max_2006  (05.11.2006 17:50:32)  [32]

Ну и прикинь, что у тебя получится для пустой строки.
Не надо фантазировать, делай правильно, кроме тех случаев когда ты точно
знаешь зачем ты это Pointer(str) делаешь


Max_2006   (2006-11-05 17:50:00) [14]

Я тут еще так подумал, может string передавать в функцию требующая PChar так: Pointer(str)? или всеже лучше PChar(str)?


Anatoly Podgoretsky   (2006-11-05 17:41:00) [15]

Не всегда, но в основном, поскольку оно обладает информацией о размере, а для PChar такой информации нет. А они с ним и работают.

А что тебя так удивляет, что С++ обладает каким то тайным знанием, там даже цикла FOR нет, под его именем идет цикл WHILE. Так же нет массивово в чистом виде, это замаскированый указатель.
И все что касается циклов и строк как правило работает медлеенне.
Ты не читай заверения маркетологов от С++


Max_2006   (2006-11-05 17:37:00) [16]

а как тогда работают в C++ с WinAPI? Там же нету string.. Если только в MFC на сколько я знаю CString (как-то так называется)... а если без MFC(на одном WinAPI), как они используют строки? Судя из цитаты:

> Не хочешь тратить время на приведение, потеряешь время и
> память на работу с динамическим выделением, при том потеряешь
> больше и ничего не приобретешь.

получается так что приложение написанное с использованием string быстрее работает чем с PChar? Т.е. быстрее чем приложение написанное на C++???


Anatoly Podgoretsky   (2006-11-05 17:09:00) [17]

> Max_2006  (05.11.2006 17:03:28)  [28]

string полностью совместим с PChar, имеет дополнительные
средства, управляющие его живучестью, уменьшае количество
ошибок, начинающим очень сложно работать с указателями,
с динамическим выделением памяти. Нет ни каких оснований
не использовать. Не хочешь тратить время на приведение, п
отеряешь время и память на работу с динамическим выделени
ем, при том потеряешь больше и ничего не приобретешь.


Max_2006   (2006-11-05 17:03:00) [18]

Я просто хотел научиться писать программы на одном API, а так как там PChar то его и использовать без использования string, чтобы не тратилось время на перевод string в PChar...


Anatoly Podgoretsky   (2006-11-05 16:20:00) [19]

> Max_2006  (05.11.2006 16:09:26)  [26]

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


Max_2006   (2006-11-05 16:09:00) [20]

N := GetSystemDirectory(PChar(S), MAX_PATH); так? Я просто где-то видел что @S[1] так лучше, или это не так?


Страницы:   1 2 3

Наверх

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