Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.042 c
14-1089057420
miwa
2004-07-05 23:57
2004.07.25
Где найти драйвера под linux для soft-modem а Conexant?


4-1087239857
Xtz
2004-06-14 23:04
2004.07.25
Окно теряет свой фокус


14-1089079484
Думкин
2004-07-06 06:04
2004.07.25
С днем рождения! 6 июня


1-1089290596
Stager
2004-07-08 16:43
2004.07.25
Просмотр HTML


1-1089520403
TUser
2004-07-11 08:33
2004.07.25
CreateProcess+AssignFile





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский