По этой теме в инете громадное колличество статей, я взялся написать статейку только потому, что
хочу по своему это объяснить.
В VB6 есть библиотечка msvbvm60 , можно сказать, это сердце VB6 . В этой библиотечке почти тысяча функций.
По непонятной причине, в VB6 не реализована работа с указателями. Хотя функция взятия адреса есть -
VarPtr(a) !!!
Но взять адрес мало, надо научиться читать то, что в этом адресе записано и уметь записать данные в
нужный адрес. В msvbvm60 для этого есть всё необходимое. Для каждого типа переменной есть своя функция.
Начнём проект с декларации функций для записи и чтения по нужным адресам.
Private Declare Sub PutMem1 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Byte)
Private Declare Sub PutMem2 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Integer)
Private Declare Sub PutMem4 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Long)
Private Declare Sub PutMem8 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Currency)
Private Declare Sub GetMem1 Lib "msvbvm60" (ByVal Addr As Long, RetVal As Byte)
Private Declare Sub GetMem2 Lib "msvbvm60" (ByVal Addr As Long, RetVal As Integer)
Private Declare Sub GetMem4 Lib "msvbvm60" (ByVal Addr As Long, RetVal As Long)
Private Declare Sub GetMem8 Lib "msvbvm60" (ByVal Addr As Long, RetVal As Currency)
Как видим в названиях функий указанно колличество байт. То есть PutMem1 - записать число типа Byte ,
а PutMem4 типа Long !!!
Теперь на форму проекта киньте четыре лябеля и кнопку.
А теперь объявим нужные переменные для нашей демки:
Dim s11, s22, s33, s44 As Variant
Dim a As Byte, b As Integer, c As Long, d As Currency
Теперь функция для кнопки, она выведет результаты работы демки:
Private Sub Command1_Click()
Label1.Caption = s11
Label2.Caption = s22
Label3.Caption = s33
Label4.Caption = s44
End Sub
А теперь и самое главное !:
Private Sub Form_Load()
По адресам переменных полученных функцией VarPtr записываем значения, обратите внимание, все переменные разных
типов и для них используются различные функции!!!
PutMem1 VarPtr(a), 105
PutMem2 VarPtr(b), 3892
PutMem4 VarPtr(c), 543543
PutMem8 VarPtr(d), 1054357675
А теперь прочитаем значения по адресам переменных.
GetMem1 VarPtr(a), s11
GetMem2 VarPtr(b), s22
GetMem4 VarPtr(c), s33
GetMem8 VarPtr(d), s44
End Sub
Как вможно заметить GetMem1 VarPtr(a), s11 абсолютно равносильно s11 = a ,
а PutMem1 VarPtr(a), 105 равносильно a = 105 )))
В реальной практике мне ни разу не довелось использовать указатели, работая в VB6 отлично и без них
можно обойтись. Но всё таки возможно в каких то очень редких случаях это может понадобиться и
самое главное, что такая возможность имеется !