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

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

Какие естьв стандартнам WinAPI функции копирования памяти


vertal ©   (2004-06-09 03:03:00) 

Какие есть в стандартнам WinAPI функции копирования памяти , позволяющие копировать произвольное число байтов(участки не будут перекрываться , если это принципиально)?Я нашел пока в ядре RtlMoveMemory , но она как-то странно работает : при повторном вызове , если число копируемых байтов больше 4 , происходит аварийное завершение программы , притом что если ту же самую область копировать через RtlMoveMemory кусками по 4 байта , то все в порядке.Видел в sdk32help описание CopyMemory , но там не сказано , из какой библиотеки она экспортируется.


Игорь Шевченко   (2004-06-11 11:13:00) [1]


> согласно справке WinSDK в Delphi к CopyMemory и MoveMemory
> заголовочный файл: winbase.h, название библиотеки не указано.


Winbase.h относится к kernel32.dll


vertal   (2004-06-11 00:51:00) [2]

>название библиотеки не указано.
И я про то же


Tano   (2004-06-09 22:23:00) [3]

согласен, не дочитал.
если поможет:
согласно справке WinSDK в Delphi к CopyMemory и MoveMemory заголовочный файл: winbase.h, название библиотеки не указано.


vertal   (2004-06-09 21:51:00) [4]

>REM: в большинстве случаев простое нажатие [Ctrl] +
>ЛК_мыши_на_имени открывает файл с реализацией или описанием этой
>процедуры (функции).
Я в курсе.Просто в данный момент у меня не запускается среда Delphi(что-то сильно заглючило , а диска с инсталлятором под рукой нет) , а запускается только компилятор dcc32.
>Если суперкритична скорость - скопируй код Move непосредственно в свою прогу - экономия на вызовах.
Я же сказал , что прога на VBA.Там нельзя прямо так использовать asm.Есть вариант определить эту Move() в двоичных кодах в переменной , скажем , строкового типа и вызывать ее через например CreateThread, передавая ее адрес , но это будет изврат почище копирования области памяти размером 50 байт порциями по 4 и 2 байта через RtlMoveMemory(что сейчас используется).


Tano   (2004-06-09 19:55:00) [5]

Move() будет достаточно (посмотри ее код - ASM), быстрее вряд ли что-то работать будет (для общего случая).
ЗЫ. Если суперкритична скорость - скопируй код Move непосредственно в свою прогу - экономия на вызовах.


Tano   (2004-06-09 19:51:00) [6]

REM: в большинстве случаев простое нажатие [Ctrl] + ЛК_мыши_на_имени открывает файл с реализацией или описанием этой процедуры (функции).


vertal   (2004-06-09 19:46:00) [7]

>Tano  (09.06.04 18:52) [6]
А я как прочитал [1] , то не заглядывая в windows.pas подумал , что в windows.pas CopyMemory определена как экспортируемая из какой-нибудь системной dll.Вот облом!
Что , остается действительно только RTlMoveMemory ? Описанные в посте странности RTlMoveMemory я склонен списывать на ее счет , так как тот код был многократно проверен.Можно конечно и кусками по 4 байта , как сейчас , но некрасиво получается .


Tano   (2004-06-09 18:52:00) [8]

windows.pas
--------------------
procedure MoveMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
begin
 Move(Source^, Destination^, Length);
end;

procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
begin
 Move(Source^, Destination^, Length);
end;

------------
таким образом, указатели проще писать для CopyMemory и MoveMemory, но обе вызывают Move. Move в свою очередь написана на ASM с применением простого и быстрого алгоритма. Допустимо перекрытие.


vertal   (2004-06-09 17:17:00) [9]

[2]> Не пиши данные поверх указателей.
Извиняюсь , но как это расшифровывается? Указатели ведь для того и предназначены , чтобы по ним можно было обратиться к данным
> В паскале есть процедура Move
Никто не спорит , в паскале и дельфи я именно ей и пользуюсь .Мне нужны именно функции из стандартного WinAPI , так как использовать я их буду в программе на VBA for Word , где даже к данным через указатель по-человечески обратиться нельзя , для обмена данными через общий регион памяти с программой на Delphi.
Спаcибо за указание [1], действительно не догадался сразу поискать в Windows.pas.


Тимохов   (2004-06-09 10:42:00) [10]


> В паскале есть процедура Move

и она быстрее чем copymemory


Игорь Шевченко   (2004-06-09 10:16:00) [11]


> Какие есть в стандартнам WinAPI функции копирования памяти
>


В паскале есть процедура Move


Anatoly Podgoretsky   (2004-06-09 08:59:00) [12]

Не пиши данные поверх указателей.


MBo   (2004-06-09 06:00:00) [13]

CopyMemory, MoveMemory - описаны в windows.pas


Наверх

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