1407 / 866 / 93
Регистрация: 08.02.2017
Сообщений: 3,700
Записей в блоге: 2

Нативный CopyMemory

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

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

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

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

Добавлено через 5 минут
Это могла быть функция тупо читающая указтель по указателю (что она и делает) в любых условиях, и это было бы суперполезно.. но тут другая логика, которая очень часто прослеживается в VB..
0
Вернулся
 Аватар для HackerVlad
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,803
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
1407 / 866 / 93
Регистрация: 08.02.2017
Сообщений: 3,700
Записей в блоге: 2
01.12.2023, 01:44  [ТС]
Безусловно, во многом бейсик такой какой надо. Это как большое здание, с открытыми и закрытыми дверями и всегда интересно, когда узнаешь про какую-то нову дверь )
1
1407 / 866 / 93
Регистрация: 08.02.2017
Сообщений: 3,700
Записей в блоге: 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
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,803
11.03.2024, 22:59
Цитата Сообщение от testuser2 Посмотреть сообщение
присвоение в VB происходит методом "Move"
не думаю, но присвоение бывает быстрее чем API
0
1407 / 866 / 93
Регистрация: 08.02.2017
Сообщений: 3,700
Записей в блоге: 2
12.03.2024, 11:12  [ТС]
HackerVlad, судя по тесту там мове
0
1407 / 866 / 93
Регистрация: 08.02.2017
Сообщений: 3,700
Записей в блоге: 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
Эксперт по электронике
7153 / 3332 / 342
Регистрация: 28.10.2011
Сообщений: 13,146
Записей в блоге: 7
17.07.2025, 19:01
Гугл ничего не знает о RefLngPtr в VBA.
0
jump
 Аватар для I can
5005 / 4769 / 852
Регистрация: 13.04.2015
Сообщений: 10,017
17.07.2025, 19:03
Цитата Сообщение от locm Посмотреть сообщение
Гугл ничего не знает о RefLngPtr в VBA.
Там же ссылка на гитхаб.
0
Эксперт по электронике
7153 / 3332 / 342
Регистрация: 28.10.2011
Сообщений: 13,146
Записей в блоге: 7
17.07.2025, 19:11
Тогда это не нативная функция VBA. Кодом можно и в цикле копировать с тем же результатом.
0
1407 / 866 / 93
Регистрация: 08.02.2017
Сообщений: 3,700
Записей в блоге: 2
18.07.2025, 02:28  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Тогда это не нативная функция VBA.
Вы не шарите в вопросе, но успеваете комментарии вставлять, какой-то цикл приплели )
0
Эксперт по электронике
7153 / 3332 / 342
Регистрация: 28.10.2011
Сообщений: 13,146
Записей в блоге: 7
18.07.2025, 12:03
Цитата Сообщение от testuser2 Посмотреть сообщение
какой-то цикл приплели
Читайте внимательно. Я написал что можно в цикле копировать и это будет нативно, то есть без явного вызова функций ОС.
0
1407 / 866 / 93
Регистрация: 08.02.2017
Сообщений: 3,700
Записей в блоге: 2
18.07.2025, 12:14  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Я написал что можно в цикле копировать и это будет нативно
Я вас не понял, пример из #110 можно сделать используя цикл?
0
Эксперт по электронике
7153 / 3332 / 342
Регистрация: 28.10.2011
Сообщений: 13,146
Записей в блоге: 7
18.07.2025, 12:25
Как можно было не понять написанное мной? Я написал
Цитата Сообщение от locm Посмотреть сообщение
Тогда это не нативная функция VBA.
Если не согласны, напишите какая нативная функция VBA используется с 110 сообщении.
Далее я написал
Цитата Сообщение от locm Посмотреть сообщение
Кодом можно и в цикле копировать с тем же результатом.
Разве я не прав?
Прочитайте название темы - "Нативный CopyMemory".
Где в 110 сообщении нативная функция VBA? Может в коде с гита используется цикл как я написал?
0
1407 / 866 / 93
Регистрация: 08.02.2017
Сообщений: 3,700
Записей в блоге: 2
18.07.2025, 12:56  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Если не согласны, напишите какая нативная функция VBA используется с 110 сообщении
Цитата Сообщение от locm Посмотреть сообщение
Может в коде с гита используется цикл как я написал?
А что же там на гите? Вы утверждаете тут спорите, но сами не смотрели ссылку с гита.
Цитата Сообщение от locm Посмотреть сообщение
Разве я не прав?
Приведите свои пример на VBA/VB6 тогда посмотрим в чем вы правы и не правы.
0
Эксперт по электронике
7153 / 3332 / 342
Регистрация: 28.10.2011
Сообщений: 13,146
Записей в блоге: 7
18.07.2025, 13:04
Цитата Сообщение от testuser2 Посмотреть сообщение
Вы утверждаете тут спорите, но сами не смотрели ссылку с гита.
Прежде чем суда притащить ссылку вы не проанализировали код и не поняли как он устроен и работает?
Цитата Сообщение от testuser2 Посмотреть сообщение
Приведите свои пример на VBA/VB6
Зачем? Вы утверждаете что используются нативные средства VBA. Из кода это вообще не очевидно. Так что доказывайте что код из 110 сообщения использует нативные средства VBA для копирования данных из памяти, а не цикл или функции системы.
0
1407 / 866 / 93
Регистрация: 08.02.2017
Сообщений: 3,700
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru