Форум: "WinAPI";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
ВнизКакие естьв стандартнам WinAPI функции копирования памяти Найти похожие ветки
← →
vertal © (2004-06-09 03:03) [0]Какие есть в стандартнам WinAPI функции копирования памяти , позволяющие копировать произвольное число байтов(участки не будут перекрываться , если это принципиально)?Я нашел пока в ядре RtlMoveMemory , но она как-то странно работает : при повторном вызове , если число копируемых байтов больше 4 , происходит аварийное завершение программы , притом что если ту же самую область копировать через RtlMoveMemory кусками по 4 байта , то все в порядке.Видел в sdk32help описание CopyMemory , но там не сказано , из какой библиотеки она экспортируется.
← →
MBo © (2004-06-09 06:00) [1]CopyMemory, MoveMemory - описаны в windows.pas
← →
Anatoly Podgoretsky © (2004-06-09 08:59) [2]Не пиши данные поверх указателей.
← →
Игорь Шевченко © (2004-06-09 10:16) [3]
> Какие есть в стандартнам WinAPI функции копирования памяти
>
В паскале есть процедура Move
← →
Тимохов © (2004-06-09 10:42) [4]
> В паскале есть процедура Move
и она быстрее чем copymemory
← →
vertal © (2004-06-09 17:17) [5][2]> Не пиши данные поверх указателей.
Извиняюсь , но как это расшифровывается? Указатели ведь для того и предназначены , чтобы по ним можно было обратиться к данным
> В паскале есть процедура Move
Никто не спорит , в паскале и дельфи я именно ей и пользуюсь .Мне нужны именно функции из стандартного WinAPI , так как использовать я их буду в программе на VBA for Word , где даже к данным через указатель по-человечески обратиться нельзя , для обмена данными через общий регион памяти с программой на Delphi.
Спаcибо за указание [1], действительно не догадался сразу поискать в Windows.pas.
← →
Tano (2004-06-09 18:52) [6]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 19:46) [7]>Tano (09.06.04 18:52) [6]
А я как прочитал [1] , то не заглядывая в windows.pas подумал , что в windows.pas CopyMemory определена как экспортируемая из какой-нибудь системной dll.Вот облом!
Что , остается действительно только RTlMoveMemory ? Описанные в посте странности RTlMoveMemory я склонен списывать на ее счет , так как тот код был многократно проверен.Можно конечно и кусками по 4 байта , как сейчас , но некрасиво получается .
← →
Tano (2004-06-09 19:51) [8]REM: в большинстве случаев простое нажатие [Ctrl] + ЛК_мыши_на_имени открывает файл с реализацией или описанием этой процедуры (функции).
← →
Tano (2004-06-09 19:55) [9]Move() будет достаточно (посмотри ее код - ASM), быстрее вряд ли что-то работать будет (для общего случая).
ЗЫ. Если суперкритична скорость - скопируй код Move непосредственно в свою прогу - экономия на вызовах.
← →
vertal © (2004-06-09 21:51) [10]>REM: в большинстве случаев простое нажатие [Ctrl] +
>ЛК_мыши_на_имени открывает файл с реализацией или описанием этой
>процедуры (функции).
Я в курсе.Просто в данный момент у меня не запускается среда Delphi(что-то сильно заглючило , а диска с инсталлятором под рукой нет) , а запускается только компилятор dcc32.
>Если суперкритична скорость - скопируй код Move непосредственно в свою прогу - экономия на вызовах.
Я же сказал , что прога на VBA.Там нельзя прямо так использовать asm.Есть вариант определить эту Move() в двоичных кодах в переменной , скажем , строкового типа и вызывать ее через например CreateThread, передавая ее адрес , но это будет изврат почище копирования области памяти размером 50 байт порциями по 4 и 2 байта через RtlMoveMemory(что сейчас используется).
← →
Tano (2004-06-09 22:23) [11]согласен, не дочитал.
если поможет:
согласно справке WinSDK в Delphi к CopyMemory и MoveMemory заголовочный файл: winbase.h, название библиотеки не указано.
← →
vertal © (2004-06-11 00:51) [12]>название библиотеки не указано.
И я про то же
← →
Игорь Шевченко © (2004-06-11 11:13) [13]
> согласно справке WinSDK в Delphi к CopyMemory и MoveMemory
> заголовочный файл: winbase.h, название библиотеки не указано.
Winbase.h относится к kernel32.dll
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c