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