Главная страница
    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.04 c
3-1088411079
TL
2004-06-28 12:24
2004.07.25
InterBase


3-1088127214
Dim!S
2004-06-25 05:33
2004.07.25
Фильтрация связанных таблиц


3-1088681917
Sir John
2004-07-01 15:38
2004.07.25
Передача структуры таблицы


3-1088487606
Ярослав
2004-06-29 09:40
2004.07.25
Массивы в IB


1-1089051990
Кастуся
2004-07-05 22:26
2004.07.25
Проверка стринги





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский