Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.00/2: Рейтинг темы: голосов - 2, средняя оценка - 4.00
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,587
Записей в блоге: 1

Нативный CopyMemory

24.09.2023, 11:14. Показов 8751. Ответов 122

Студворк — интернет-сервис помощи студентам
Натолкнуло на рассуждения, уже ранее упомянутое.. В общем то уже ранее слышал, про замедление работы апишных функций в современных реалиях. Собственно вопрос, возможно ли копирование блока/участка с динамически меняющимся (настраиваемым) значением(?). Собственно копирование то возможно блоков разного размера, есл говорить о больших - замапив на оба блока массивы и выполнив присвоения в цикле с одного массива в другой. Тесты показывают, что блок одинакового размера копируется в 4 раза быстрей с помощью массива long, нежели битового и также в других случаях - чем меньше итераций, тем кратно быстрей. Можно копировать и большие блоки за одну операцию средствами VB. Если создать тип, с фиксированным массивом внутри, то один экземпляр типа (фактически массив) можно присвоить другому экземпляру типа. С динамическими массивами так не получится, блок перезаписывается, также как и у строк. С другой стороны у фиксированого массива свои недостатки, его нельзя замапить изменить его заголовочную структуру и даже поменять указатель на нее

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Public Type tpArr
    arr(1000) As Integer
End Type
 
Sub ffsff
    Dim ta1 As tpArr, ta2 As tpArr
    
    Debug.Print VarPtr(ta1.arr(0))
    ta1 = ta2
    Debug.Print VarPtr(ta1.arr(0))  
End Sub
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.09.2023, 11:14
Ответы с готовыми решениями:

Private Declare Sub CopyMemory Lib 'kernel32' Alias 'RtlMoveMemory' (Destination As Any, Source As Any, ByVal Length As Long)
В QBasic можно написать: DEF SEG=&H40 PRINT PEEK(&H100) 'ЧИТАЕМ БАЙТ В ОПЕРАТИВКЕ ПО АДРЕСУ...

В WinXP не работает API процедура CopyMemory. Что делать?
В WinXP не работает API процедура CopyMemory. Что делать? Public Declare Sub CopyMemory Lib...

Почему указатель нулевой при CopyMemory
Здрасть. Функция CopyMemory говорит что указатель is 0. Как исправить? *Old = AllocateMemory(1)...

122
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
30.11.2023, 15:06
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от testuser2 Посмотреть сообщение
VarPtr(ByVal s$), вернет тоже что и StrPtr(s)
Спасибо, я этого реально не знал.
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,587
Записей в блоге: 1
30.11.2023, 15:14  [ТС]
HackerVlad, факт есть, а вот практической значимости я так и не смог найти. Есть еще один факт, еще мене значимый, но более загадочный, что StrPtr принимает не только строку но и long, но вот цифры, которые он(она х.з) при этом возвращает, я не смог разгадать..
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
30.11.2023, 17:32
Цитата Сообщение от testuser2 Посмотреть сообщение
он(она х.з)
StrPtr это мальчик, думаю, а не девочка, значит он

Добавлено через 38 секунд
StrPtr он мой, а если функция то она моя

Добавлено через 1 минуту
Цитата Сообщение от testuser2 Посмотреть сообщение
я не смог разгадать
Адрес на строку возвращает

Добавлено через 2 минуты
а если втюхивать Long то наверное значит адрес на переменную лонг по логике, хотя хрен его знает! The Trick, думаю, точно знает...
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,587
Записей в блоге: 1
30.11.2023, 17:59  [ТС]
Когда ты вводдишь strptr( то видишь подсказку, что параметр должен быть строковый, но, фактически, функция хавает еще variant и long. И это очень быстрая функция, которая ожидаемо должна быть простой по алгоритму. Ну там наверное без ассемблера не обошлось

Добавлено через 5 минут
Это могла быть функция тупо читающая указтель по указателю (что она и делает) в любых условиях, и это было бы суперполезно.. но тут другая логика, которая очень часто прослеживается в VB..
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
30.11.2023, 18:17
Вообще StrPtr и VarPtr это недокументированные функции VB, поэтому они могли её написать чисто для себя майкры эти, и могли особо не заморачиваться с проверками, а строка там или не строка...

Добавлено через 1 минуту
Фактически это значит, что в майкрософте думали чтобы этими функциями StrPtr и VarPtr никто не будет пользоваться... А на деле вышло всё нооборот все ими только и пользуются ибо очень полезно!

Добавлено через 3 минуты
Когда создавался VB6 в майкрософте думали что все будут пользоваться ANSI строками, так как в 1998 году в Windows98 небыло встроенной поддержки юникода

Добавлено через 46 секунд
И это просто чудо, что на то время, они почему-то всё же сделали строки в VB в кодировке UTF-16 LE, это нам просто очень повезло.

Добавлено через 3 минуты
А вот например в дельфи строки в ANSI

Добавлено через 4 минуты
Вот полезная ссылка по этой теме: https://learn.microsoft.com/ru... dfrom=MSDN
1
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,587
Записей в блоге: 1
01.12.2023, 01:44  [ТС]
Безусловно, во многом бейсик такой какой надо. Это как большое здание, с открытыми и закрытыми дверями и всегда интересно, когда узнаешь про какую-то нову дверь )
1
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,587
Записей в блоге: 1
11.03.2024, 11:52  [ТС]
Небольшой тест на копирование перекрывающейся области. Что будет если копировать присвоением? Как я понимаю, присвоение в VB происходит методом "Move" (?). Второй результат при копировании функцией Mikle Quits, у него наверное "Copy", 3й - функция RtlCopyMemory (на vba x64), 4й "__vbaCopyBytes"
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub CopyMove(Optional cInp@, Optional cOut@, Optional ByVal l&)
    Dim i%, b(15) As Byte
    
    For i = 0 To 15
        b(i) = i + 1
    Next
    
    RtlMoveMemory ByVal VarPtr(l) - ptrSz, VarPtr(b(5))     'устанавливаем указатель cOut на b(5)
    RtlMoveMemory ByVal VarPtr(l) - ptrSz * 2, VarPtr(b(8)) 'устанавливаем указатель cInp yf b(8)
    
    cInp = cOut                   'рез. 1,2,3,4,5,6,7,8,6,7,8,9,10,11,12,13
'    CopyMemory cOut, cInp, 8     'рез. 1,2,3,4,5,6,7,8,6,7,8,9,7,8,9,13
'    RtlCopyMemory cInp, cOut, 8  'рез. 1,2,3,4,5,6,7,8,6,7,8,6,7,8,9,10
'    CopyBytes 8, cInp, cOut      'рез. 1,2,3,4,5,6,7,8,6,7,8,9,7,8,9,13
    Debug.Print
    For i = 0 To 15
        Debug.Print b(i) & ",";
    Next
End Sub
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
11.03.2024, 22:59
Цитата Сообщение от testuser2 Посмотреть сообщение
присвоение в VB происходит методом "Move"
не думаю, но присвоение бывает быстрее чем API
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,587
Записей в блоге: 1
12.03.2024, 11:12  [ТС]
HackerVlad, судя по тесту там мове
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,587
Записей в блоге: 1
17.07.2025, 14:58  [ТС]
В истории VBA, кажется произошло что-то колоссальное! На Гитхабе появился код, позволяющий манипулировать указателями в памяти чистыми средствами VBA, без объявления api-деклараций https://github.com/WNKLER/RefTypes. Я это узнал, поскольку подписан на Кристиана Буса, а он сделал "Starred" на этот репозиторий. Там была такая аннотация
Fully-Native (no API declarations, no TypeLibs, no dependencies) VBA/VB6 Library for manipulating arbitrary memory addresses as intrinsic types.
Я отнесся скептически, но когда я проверил, то офигел, потому, что это действительно рабоает.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Test()
    Dim lAr1&(), lAr2&(), pSA As LongPtr
    Initialize
    
    ReDim lAr1(2): lAr1(1) = 123
    
    pSA = RefLngPtr(VarPtr(pSA) + LenB(pSA ) * 2)
    
    RefLngPtr(VarPtr(pSA ) + LenB(pSA )) = pSA
    
    RefLngPtr(VarPtr(pSA ) + LenB(pSA )) = CLngPtr(0)
End Sub
2
Эксперт по электронике
6583 / 3210 / 335
Регистрация: 28.10.2011
Сообщений: 12,532
Записей в блоге: 7
17.07.2025, 19:01
Гугл ничего не знает о RefLngPtr в VBA.
0
sleep
 Аватар для I can
4931 / 4593 / 840
Регистрация: 13.04.2015
Сообщений: 9,752
17.07.2025, 19:03
Цитата Сообщение от locm Посмотреть сообщение
Гугл ничего не знает о RefLngPtr в VBA.
Там же ссылка на гитхаб.
0
Эксперт по электронике
6583 / 3210 / 335
Регистрация: 28.10.2011
Сообщений: 12,532
Записей в блоге: 7
17.07.2025, 19:11
Тогда это не нативная функция VBA. Кодом можно и в цикле копировать с тем же результатом.
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,587
Записей в блоге: 1
18.07.2025, 02:28  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Тогда это не нативная функция VBA.
Вы не шарите в вопросе, но успеваете комментарии вставлять, какой-то цикл приплели )
0
Эксперт по электронике
6583 / 3210 / 335
Регистрация: 28.10.2011
Сообщений: 12,532
Записей в блоге: 7
18.07.2025, 12:03
Цитата Сообщение от testuser2 Посмотреть сообщение
какой-то цикл приплели
Читайте внимательно. Я написал что можно в цикле копировать и это будет нативно, то есть без явного вызова функций ОС.
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,587
Записей в блоге: 1
18.07.2025, 12:14  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Я написал что можно в цикле копировать и это будет нативно
Я вас не понял, пример из #110 можно сделать используя цикл?
0
Эксперт по электронике
6583 / 3210 / 335
Регистрация: 28.10.2011
Сообщений: 12,532
Записей в блоге: 7
18.07.2025, 12:25
Как можно было не понять написанное мной? Я написал
Цитата Сообщение от locm Посмотреть сообщение
Тогда это не нативная функция VBA.
Если не согласны, напишите какая нативная функция VBA используется с 110 сообщении.
Далее я написал
Цитата Сообщение от locm Посмотреть сообщение
Кодом можно и в цикле копировать с тем же результатом.
Разве я не прав?
Прочитайте название темы - "Нативный CopyMemory".
Где в 110 сообщении нативная функция VBA? Может в коде с гита используется цикл как я написал?
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,587
Записей в блоге: 1
18.07.2025, 12:56  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Если не согласны, напишите какая нативная функция VBA используется с 110 сообщении
Цитата Сообщение от locm Посмотреть сообщение
Может в коде с гита используется цикл как я написал?
А что же там на гите? Вы утверждаете тут спорите, но сами не смотрели ссылку с гита.
Цитата Сообщение от locm Посмотреть сообщение
Разве я не прав?
Приведите свои пример на VBA/VB6 тогда посмотрим в чем вы правы и не правы.
0
Эксперт по электронике
6583 / 3210 / 335
Регистрация: 28.10.2011
Сообщений: 12,532
Записей в блоге: 7
18.07.2025, 13:04
Цитата Сообщение от testuser2 Посмотреть сообщение
Вы утверждаете тут спорите, но сами не смотрели ссылку с гита.
Прежде чем суда притащить ссылку вы не проанализировали код и не поняли как он устроен и работает?
Цитата Сообщение от testuser2 Посмотреть сообщение
Приведите свои пример на VBA/VB6
Зачем? Вы утверждаете что используются нативные средства VBA. Из кода это вообще не очевидно. Так что доказывайте что код из 110 сообщения использует нативные средства VBA для копирования данных из памяти, а не цикл или функции системы.
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,587
Записей в блоге: 1
18.07.2025, 13:32  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Прежде чем суда притащить ссылку вы не проанализировали код и не поняли как он устроен и работает?
Из чего вы сделали такой вывод?
Цитата Сообщение от locm Посмотреть сообщение
Вы утверждаете что используются нативные средства VBA. Из кода это вообще не очевидно.
И что я должен тащить с гита весь код? А если там 10 тыс. строк? Все кому надо посмотрят и если что-то не так скажут об этом. В таком случае я буду что-то доказывать.
Цитата Сообщение от locm Посмотреть сообщение
Так что доказывайте что код из 110 сообщения использует нативные средства VBA для копирования данных из памяти, а не цикл или функции системы.
Почему я должен что-то доказывать? Там 2 лайка, между прочем стоит от 2х модераторов, разве это не косвенное доказательство того, что код соответстует описанию?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.07.2025, 13:32
Помогаю со студенческими работами здесь

CopyMemory жжет
#If Win64 Then Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory"...

CopyMemory ?
Как использовать CopyMemory в алгоритмах сортировки с различными типами данных ??? Пытался...

Реализовать нативную функцию дв.в.восьм
Доброго времени суток. Собственно по тз требуется реализовать нативную функцию Excel дв.в.восьм...

memcpy/CopyMemory + 2-мерный динамический массив
Третий день в ступоре из-за ругательства компилятора. Есть проблема: нужно скопировать данные из...

CreateFileMapping ошибка в CopyMemory
Жалуестя на 1>c:\users\сергей\documents\visual studio 2010\projects\lab2\lab2\lab2.cpp(45): error...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru