MakeLong




Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
'Combina due interi in un Long (Double Word)

Public Function MakeLong(ByVal iLow As Integer, _
ByVal iHigh As Integer) As Long
Dim lAddress As Long
lAddress = VarPtr(MakeLong)
MakeLong = iLow 'Assegna normalmente la parola bassa:
'la parola alta e' zero in questo momento e va riempita con il

'secondo 'intero:

CopyMemory ByVal lAddress + 2, iHigh, 2
End Function

Quando si usano le API di Windows spesso e' necessario
combinare due interi a 16 bit (Integer) in un intero a
32 bit (Long), uno nella parola bassa e uno nella parola
alta. Questo e' necessario ad esempio quando vogliamo
gestire certi messaggi con SendMessage. Possiamo usare
allo scopo la funzione API CopyMemory in combinazione con
la funzione VBA non documentata VarPtr(), che restituisce
un puntatore (indirizzo di memoria) ad una variabile
qualsiasi (eccetto stringhe e oggetti). In pratica, dopo
aver assegnato normalmente al risultato la parola bassa
(byte 0 e 1), usiamo CopyMemory per copiare la parola alta
(byte 2 e 3) sul Long risultante, usando VarPtr per ottenere
l'indirizzo del byte 2. Ecco la funzione:










( makelong.html )- by Paolo Puglisi - Modifica del 17/12/2023