1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,632
Записей в блоге: 2

Нативный CopyMemory

24.09.2023, 11:14. Показов 9207. Ответов 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
1746 / 642 / 45
Регистрация: 10.09.2021
Сообщений: 2,774
30.11.2023, 15:06
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от testuser2 Посмотреть сообщение
VarPtr(ByVal s$), вернет тоже что и StrPtr(s)
Спасибо, я этого реально не знал.
0
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,632
Записей в блоге: 2
30.11.2023, 15:14  [ТС]
HackerVlad, факт есть, а вот практической значимости я так и не смог найти. Есть еще один факт, еще мене значимый, но более загадочный, что StrPtr принимает не только строку но и long, но вот цифры, которые он(она х.з) при этом возвращает, я не смог разгадать..
0
Вернулся
 Аватар для HackerVlad
1746 / 642 / 45
Регистрация: 10.09.2021
Сообщений: 2,774
30.11.2023, 17:32
Цитата Сообщение от testuser2 Посмотреть сообщение
он(она х.з)
StrPtr это мальчик, думаю, а не девочка, значит он

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

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

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

Добавлено через 5 минут
Это могла быть функция тупо читающая указтель по указателю (что она и делает) в любых условиях, и это было бы суперполезно.. но тут другая логика, которая очень часто прослеживается в VB..
0
Вернулся
 Аватар для HackerVlad
1746 / 642 / 45
Регистрация: 10.09.2021
Сообщений: 2,774
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
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,632
Записей в блоге: 2
01.12.2023, 01:44  [ТС]
Безусловно, во многом бейсик такой какой надо. Это как большое здание, с открытыми и закрытыми дверями и всегда интересно, когда узнаешь про какую-то нову дверь )
1
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,632
Записей в блоге: 2
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
1746 / 642 / 45
Регистрация: 10.09.2021
Сообщений: 2,774
11.03.2024, 22:59
Цитата Сообщение от testuser2 Посмотреть сообщение
присвоение в VB происходит методом "Move"
не думаю, но присвоение бывает быстрее чем API
0
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,632
Записей в блоге: 2
12.03.2024, 11:12  [ТС]
HackerVlad, судя по тесту там мове
0
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,632
Записей в блоге: 2
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
Эксперт по электронике
6868 / 3291 / 340
Регистрация: 28.10.2011
Сообщений: 12,900
Записей в блоге: 7
17.07.2025, 19:01
Гугл ничего не знает о RefLngPtr в VBA.
0
dive
 Аватар для I can
4972 / 4672 / 848
Регистрация: 13.04.2015
Сообщений: 9,877
17.07.2025, 19:03
Цитата Сообщение от locm Посмотреть сообщение
Гугл ничего не знает о RefLngPtr в VBA.
Там же ссылка на гитхаб.
0
Эксперт по электронике
6868 / 3291 / 340
Регистрация: 28.10.2011
Сообщений: 12,900
Записей в блоге: 7
17.07.2025, 19:11
Тогда это не нативная функция VBA. Кодом можно и в цикле копировать с тем же результатом.
0
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,632
Записей в блоге: 2
18.07.2025, 02:28  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Тогда это не нативная функция VBA.
Вы не шарите в вопросе, но успеваете комментарии вставлять, какой-то цикл приплели )
0
Эксперт по электронике
6868 / 3291 / 340
Регистрация: 28.10.2011
Сообщений: 12,900
Записей в блоге: 7
18.07.2025, 12:03
Цитата Сообщение от testuser2 Посмотреть сообщение
какой-то цикл приплели
Читайте внимательно. Я написал что можно в цикле копировать и это будет нативно, то есть без явного вызова функций ОС.
0
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,632
Записей в блоге: 2
18.07.2025, 12:14  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Я написал что можно в цикле копировать и это будет нативно
Я вас не понял, пример из #110 можно сделать используя цикл?
0
Эксперт по электронике
6868 / 3291 / 340
Регистрация: 28.10.2011
Сообщений: 12,900
Записей в блоге: 7
18.07.2025, 12:25
Как можно было не понять написанное мной? Я написал
Цитата Сообщение от locm Посмотреть сообщение
Тогда это не нативная функция VBA.
Если не согласны, напишите какая нативная функция VBA используется с 110 сообщении.
Далее я написал
Цитата Сообщение от locm Посмотреть сообщение
Кодом можно и в цикле копировать с тем же результатом.
Разве я не прав?
Прочитайте название темы - "Нативный CopyMemory".
Где в 110 сообщении нативная функция VBA? Может в коде с гита используется цикл как я написал?
0
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,632
Записей в блоге: 2
18.07.2025, 12:56  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Если не согласны, напишите какая нативная функция VBA используется с 110 сообщении
Цитата Сообщение от locm Посмотреть сообщение
Может в коде с гита используется цикл как я написал?
А что же там на гите? Вы утверждаете тут спорите, но сами не смотрели ссылку с гита.
Цитата Сообщение от locm Посмотреть сообщение
Разве я не прав?
Приведите свои пример на VBA/VB6 тогда посмотрим в чем вы правы и не правы.
0
Эксперт по электронике
6868 / 3291 / 340
Регистрация: 28.10.2011
Сообщений: 12,900
Записей в блоге: 7
18.07.2025, 13:04
Цитата Сообщение от testuser2 Посмотреть сообщение
Вы утверждаете тут спорите, но сами не смотрели ссылку с гита.
Прежде чем суда притащить ссылку вы не проанализировали код и не поняли как он устроен и работает?
Цитата Сообщение от testuser2 Посмотреть сообщение
Приведите свои пример на VBA/VB6
Зачем? Вы утверждаете что используются нативные средства VBA. Из кода это вообще не очевидно. Так что доказывайте что код из 110 сообщения использует нативные средства VBA для копирования данных из памяти, а не цикл или функции системы.
0
1399 / 857 / 92
Регистрация: 08.02.2017
Сообщений: 3,632
Записей в блоге: 2
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru