Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.25;
Скачать: CL | DM;

Вниз

Какие естьв стандартнам 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 вся ветка

Текущий архив: 2004.07.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.044 c
3-1088851968
ZedeS!
2004-07-03 14:52
2004.07.25
Удаление записей через ADOTable


1-1089522743
Никита
2004-07-11 09:12
2004.07.25
Работа с TToolBar


1-1089300240
P@vel
2004-07-08 19:24
2004.07.25
Char & String


1-1089728961
Studentik
2004-07-13 18:29
2004.07.25
Стиль XP в XP


1-1089680549
olhovik
2004-07-13 05:02
2004.07.25
DBGrid