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

Нативный CopyMemory

24.09.2023, 11:14. Показов 8570. Ответов 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
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
22.11.2023, 10:18
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от testuser2 Посмотреть сообщение
Тут уж, как говориться, "маэстро взялся за дело"! Серьезная информация поступила )
полностью согласен!
The trick, впечатляет — моё почтение
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
22.11.2023, 11:46
да надо самому научиться пользоваться дизассемблером
реверс-инженеринг - это интересно

Добавлено через 1 минуту
вот например, мне нужен был исходный код функции InputBox, если бы я получил этот исходный код сразу через дизассемблер например, то я сразу бы и узнал про функцию DialogBoxParam и кучу бы времени сэкономил

Добавлено через 51 секунду
самому можно быть маэстро короче
0
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,514
Записей в блоге: 1
25.11.2023, 09:49  [ТС]
Небольшое лирическое отступление.
Кликните здесь для просмотра всего текста
Периодически можно увидеть вопрос, как можно защитить свой vba проект. Есть встроенная защита паролем, есть хак с правкой бинарника vba, но это не надежные способы. Не так давно появился Vba-compiler очень продуманый, который стоит как грузовик (если бы его у нас еще можно было купить )) Я кстати попробовал его в триал режиме, там действительно компилится библиотека, из которой функции подключаются через Declare (в vb использовать эту библиотеку не получилось) В этой связи думается, что, так скажем, 32-битная эпоха, длившаяся очень долго, была на самом деле золотым временем в VBA. Потому, что макросы VBA можно было спокойно и легко писать на VB6 и компилить в библиотеку. И уровень защиты отличный + 2x скорость. Сейчас, конечно везде и всюду x64.. И в этом плане для VBA-шников, я думаю, также как и для других пользователей VB должен быть интересен Twin Basic.. Сам я пока не пользовался, и не видел большого энтузиазма от местных респондентов, так понимаю, продукт сырой.. Собственно, на этом мысль заканчивется..


Добавлено через 23 минуты

Продолжение мысли:
Или вопросы типа "как ограничить использование файла по времени". Гипотетически это легко все можно было бы реализовать в виде vb-шной библиотеки. Коненчо существует С++ xll, но на VB то это все гораздо проще.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
25.11.2023, 13:43
Цитата Сообщение от testuser2 Посмотреть сообщение
Есть встроенная защита паролем
Видел как взламывают пароли, которые как раз в InputBox там уже всё сто раз дизассемблировали и взломали, такие пароли щёлкаются как орешки уже давно)))
0
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,514
Записей в блоге: 1
25.11.2023, 16:02  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
Видел как взламывают пароли
Самое печальное, что там и не нужно взламывать пароли. Самое смешное, что для макросов vba обычно и не нужна защита уровня топ, но и той защиты которая есть не совсем достаточно.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
25.11.2023, 19:29
testuser2, для этого как раз и существует ActiveX библиотеки. Их можно использовать из 64 битного софта. Компилируй ActiveX EXE или DLL - создавай объекты.
0
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,514
Записей в блоге: 1
26.11.2023, 04:57  [ТС]
The trick, но там же не получится подключить 64й Excel в референсах и использовать все его типы и объекты, я не проверял конечно, но, что точно, это нельзя будет использовать в одном потоке с vba
0
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,514
Записей в блоге: 1
27.11.2023, 12:31  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
К счастью есть TlbCall который не вызывает ничего лишнего
Подключил одну, потом другую из имеющихся у меня tlb в обоих есть разные вариации CM и обе вызывают фатальную ошибку приложения. В чем может быть причина. В обоих tlb CM прописан с праметром размера типа Long, хотя более правильно LongPtr, может быть в этом загвоздка или под x64 нужно вообще длать специальную tlb?
Простой код
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub TestCM()
    Dim i&, t!, a$, b$, c$
    
    a = "fgjhkjlserveeFHJHHрырвРЛЛДАКЕИжррдппрдрдрлуккушцшцббюбфы"
    b = String(Len(a), vbNullChar)
    c = b
    t = Timer
    For i = 1 To 1000000
        'Функция из Declare работает без ошибок
'        CopyMemory1 ByVal StrPtr(b), ByVal StrPtr(a), LenB(b)
'        CopyMemory1 ByVal StrPtr(b), ByVal StrPtr(c), LenB(b)
        'функция из tlb
        CopyMemoryStrToStr b, c, LenB(b)
        CopyMemoryStrToStr b, a, LenB(b)
    Next
    t = Timer - t
    Debug.Print t
End Sub
Вообще на x64 vba при обычном декларировании в обязаловку требуется добавлять ключевое слово PtrSafe "Declare PtrSafe Sub CopyMemory"

Добавлено через 18 минут
Хорошую информацию нашел (перевод)
tB планирует поддерживать экспорт TLB в будущем; когда эта функция станет доступна, я экспортирую tbShellLib как TLB для 64-битного VBA. Но до тех пор, если вы хотите заниматься 64-битной разработкой, используйте TwinBASIC. Создайте новый проект, затем выполните следующие действия, чтобы добавить tbShellLib в качестве ссылки, после чего вы сможете протестировать IActiveScript и связанные интерфейсы.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
27.11.2023, 21:08
Попробуй эту. (функция memcpy)
0
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,514
Записей в блоге: 1
28.11.2023, 04:35  [ТС]
The trick, такое же поведение, как и в предыдущих случаях с tlb первый вызов нормальный, на втором случается это
Code
1
ФАТАЛЬНАЯ ОШИБКА: Unhandled Access Violation Reading Oxffffffff Exception at 903451ah
Добавлено через 2 часа 36 минут
А это же еще и cdecl..
0
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,514
Записей в блоге: 1
28.11.2023, 17:38  [ТС]
что-то тишина на формуме последнее время, наверное грипп. Пейте перекись 2 капли на стакан воды.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
28.11.2023, 19:32
Цитата Сообщение от testuser2 Посмотреть сообщение
наверное грипп. Пейте перекись 2 капли на стакан воды
пхахаахахх да просто все заняты своей работой)))) у нас в нашем разделе и так мало людей)))

Добавлено через 52 секунды
testuser2, ты тут самый активный кстати по моему)))
1
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
28.11.2023, 21:12
Цитата Сообщение от testuser2 Посмотреть сообщение
The trick, такое же поведение, как и в предыдущих случаях с tlb первый вызов нормальный, на втором случается это
Скинь проект т.к. я не знаю что у тебя за CopyMemoryStrToStr. Скинь проект или код где используется memcpy из моей tlb.

Цитата Сообщение от testuser2 Посмотреть сообщение
А это же еще и cdecl..
Нет. Это просто псевдоним, а функция на самом деле RtlMoveMemory.
0
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,514
Записей в блоге: 1
29.11.2023, 02:06  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Скинь проект т.к. я не знаю что у тебя за CopyMemoryStrToStr.
Там несколько tlb, в т.ч. oleexp от fafalone в которой даже 3 парпметр CM указан как longptr, но он, кстати, предупреждает, что tlb работает только под x32
Вложения
Тип файла: zip TLB_Excel.zip (1.68 Мб, 3 просмотров)
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.11.2023, 11:12
Цитата Сообщение от testuser2 Посмотреть сообщение
от fafalone
Кстати даже fafalone постоянно лестно отзывается о кодах нашего The Trick и сегодня и вчера я читал... Нашего трюкача постоянно нахваливают иностранцы))))

Добавлено через 58 секунд
fafalone кстати это наверное примерно такой же гений как и the trick
2
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
29.11.2023, 20:09
Лучший ответ Сообщение было отмечено testuser2 как решение

Решение

testuser2, да проблема в 3-м параметре. Там должно быть 64 битное значение на 64 битной платформе.
1
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,514
Записей в блоге: 1
30.11.2023, 01:51  [ТС]
The trick, спасибо, а я если честно подозревал другое, потому, что у fafalone в tlb прописан LongPtr, но все равно, происходит ошибка
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
30.11.2023, 01:55
Цитата Сообщение от testuser2 Посмотреть сообщение
что у fafalone в tlb прописан LongPtr, но все равно, происходит ошибка
Где?
Миниатюры
Нативный CopyMemory  
0
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,514
Записей в блоге: 1
30.11.2023, 04:59  [ТС]
The trick, блин, я что-то понапутал со своими CM-ками видимо ) Скажи пожалуйста, как в TLB прописать 64 битный параметр?

Добавлено через 6 минут
Вижу в Windows Data Tipes есть LONG_PTR может быть его прописывать в odl?

Добавлено через 2 часа 21 минуту
Точно, это он.
3 параметр это size_t
Code
1
typedef LONG_PTR SSIZE_T
0
1384 / 838 / 91
Регистрация: 08.02.2017
Сообщений: 3,514
Записей в блоге: 1
30.11.2023, 14:23  [ТС]
Это я думал, что в odl поддерживаютя стандартные типы windows, он же вроде с-подобный такой, даже не знаю, можно ли там делать проверку типа #If Win64, но, сделать универсальную кроссбитную тлб на самом деле оказалось очень просто - 3й параметр надо задекларить как void (без звездочки) и все закрутилось на vba x64, при чем там быстрее оказалось на 12%. Проверил таже RtlCopyMemory (доступную в 64битной версии kernel32) и она оказалась медленей чем Move на 10%.

Добавлено через 2 часа 38 минут
C tlb-шкой можно строки копировать так (без StrPtr)
Visual Basic
1
CopyMemory ByVal b, ByVal a, CLngPtr(LenB(b))
Это заметил, кстати такое, когда строку предаешь byval, в VarPtr то возвращается указатель на буфер. VarPtr(ByVal s$), вернет тоже что и StrPtr(s). Пробовал также с массивами и апишным VarPtr (ArrPtr), чтобы возвратило указатель на SA - не получилось.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.11.2023, 14:23
Помогаю со студенческими работами здесь

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...


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru