Работа с указателями в VB6
Запись от The trick размещена 18.04.2014 в 02:25
Показов 12796
Комментарии 8
Метки vb
Для начала нужные декларации
Например можно получить доступ к адресу переменной в стеке переданной по ссылке. Например так.
Ни для кого не секрет что массив в VB представляет собой обычный SafeArray массив. В структуре данных такого массива содержится много полезной информации, также есть указатель на данные. Что мы делаем, мы создаем 2 массива: 1-й (с адресом) ссылается на указатель на данные второго массива. В итоге изменяя значения в первом массиве, 2-й автоматически будет ссылаться на нужные данные. 2-й с непосредственно с даными, на который указывает первый. Так же после всех манипуляций нужно вернуть все указатели назад, чтобы VB корректно очистил память. Для всех манипуляций я создал вспомогательные функции и структуру для восстановления данных. Адрес SafeArray можно получить через Not Not Arr, но в IDE после таких манипуляций идут глюки с вычислениями с плавающей точкой.
| ||||||||||||||||||||
Метки vb
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 8
Комментарии
-
Запись от уни размещена 31.05.2014 в 22:39
-
Спасибо. Я читал эту статью
Сообщение от уни
Запись от The trick размещена 31.05.2014 в 22:42
-
Запись от Dragokas размещена 15.11.2014 в 23:28
-
Нет. Реально функция представляет собой такую:
Т.к. параметры передаются через стек задом-наперед то стек принимает такой вид (образно):Visual Basic 1 2
Private Function Test(ByVal AddressPointer As Long, Optional ByVal nu As Long) End Function
AddressPointer - указатель на структуру Pointer, VB6 обращается к этой структуре внутри этой функции по этому указателю. Теперь если мы поменяем значение AddressPointer, то оно будет указывать на что-то другое - в этом смысл. Напрямую мы не можем узнать значение AddressPointer, т.к. если выполнить VarPtr(Pointer) то мы фактически получим VarPtr(Pointer.Name). Но т.к. мы знаем правило размещения параметров в стеке, мы можем узнать этот адрес из переменной nu, поэтому адрес будет равен VarPtr(nu) - 4.Code 1 2 3 4
Адрес Значение 0000000 AddressPointer 0000004 nu
Запись от The trick размещена 15.11.2014 в 23:40
-
Запись от Dragokas размещена 15.11.2014 в 23:57
-
Да.
Сообщение от Dragokas
Запись от The trick размещена 15.11.2014 в 23:58
-
Запись от Dragokas размещена 16.11.2014 в 00:29
-
В данном случае в скомпилированном виде никак. Указатель можно переписать на что угодно и он будет это интерпретировать как структуру если сможет.
Сообщение от Dragokas
Запись от The trick размещена 16.11.2014 в 18:42


