Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long) 'Restituisce la parola bassa di un Long Public Function LoWord(ByVal l As Long) As Integer If (l And &H8000&) = 0 Then LoWord = l And &HFFFF& Else LoWord = &H8000 Or (l And &H7FFF&) End If End Function 'Restituisce la parola alta di un Long Public Function HiWord(ByVal l As Long) As Integer Dim lAddress As Long lAddress = VarPtr(l) + 2 CopyMemory HiWord, ByVal lAddress, 2 End Function Quando si usano le API di Windows spesso e' necessario estrarre due interi a 16 bit (Integer) da 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). La funzione LoWord e' completamente VB, mentre la HiWord usa l'approccio con puntatori: |