$OPTIMIZE ON $APPTYPE CONSOLE $TYPECHECK ON $ESCAPECHARS ON CONST GMEM_FIXED=0 CONST GMEM_MOVEABLE=2 CONST GMEM_ZEROINIT=64 CONST GMEM_INVALID_HANDLE=&H8000 DECLARE SUB CopyMemory LIB "kernel32.dll" ALIAS "RtlMoveMemory" (ByVal dest AS LONG, ByVal source AS LONG, ByVal numBytes AS LONG) DECLARE FUNCTION GetLastError LIB "kernel32.dll" ALIAS "GetLastError" () AS LONG DECLARE FUNCTION GlobalAlloc LIB "kernel32.dll" ALIAS "GlobalAlloc" (flags AS LONG, numBytes AS LONG) AS LONG DECLARE FUNCTION GlobalFree LIB "kernel32.dll" ALIAS "GlobalFree" (hMem AS LONG) AS LONG DECLARE FUNCTION GlobalLock LIB "kernel32.dll" ALIAS "GlobalLock" (hMem AS LONG) AS LONG DECLARE FUNCTION GlobalUnlock LIB "kernel32.dll" ALIAS "GlobalUnlock" (hMem AS LONG) AS LONG DIM mem_Memory AS LONG, mem_Lock AS LONG, mem_Block AS LONG DIM mem_Offset AS LONG, MLong AS LONG, MWord AS WORD, MByte AS BYTE DIM MDouble AS DOUBLE, MString$ AS STRING, MString_Buffer$ AS STRING ' Generic Variables. DIM rtn AS LONG, count AS LONG MString_Buffer$=STRING$(256, 0) SUB Free_DefaultMemory IF mem_Memory<>0 THEN rtn=GlobalFree(mem_Memory) IF rtn=0 THEN 'MEM FREED ELSE 'MEM NOT FREED END IF END IF END SUB SUB UnLock_DefaultMemory IF mem_Lock<>0 THEN rtn=GlobalUnlock(mem_Lock) IF ((rtn=0) AND (GetLastError()=0)) THEN 'MEM UNLOCKED ELSE 'MEM NOT UNLOCK END IF END IF END SUB SUB Peek_String(mem_Buffer AS LONG, mem_Offset AS LONG, string_Length AS LONG) MString$=VARPTR$(mem_Buffer+mem_Offset) CopyMemory VARPTR(MString_Buffer$), mem_Buffer+mem_Offset, string_Length END SUB SUB Peek_Double(mem_Buffer AS LONG, mem_Offset AS LONG) CopyMemory VARPTR(MDouble), mem_Buffer+mem_Offset, 8 END SUB SUB Peek_Long(mem_Buffer AS LONG, mem_Offset AS LONG) CopyMemory VARPTR(MLong), mem_Buffer+mem_Offset, 4 END SUB SUB Peek_Word(mem_Buffer AS LONG, mem_Offset AS LONG) CopyMemory VARPTR(MWord), mem_Buffer+mem_Offset, 2 END SUB SUB Peek_Byte(mem_Buffer AS LONG, mem_Offset AS LONG) CopyMemory VARPTR(MByte), mem_Buffer+mem_Offset, 1 END SUB SUB Poke_String(mem_Buffer AS LONG, mem_Offset AS LONG, string_Buffer$ AS STRING, string_Length AS LONG) MString$=string_Buffer$+CHR$(0) CopyMemory mem_Buffer+mem_Offset, VARPTR(MString$), string_Length END SUB SUB Poke_Double(mem_Buffer AS LONG, mem_Offset AS LONG, double_Value AS DOUBLE) MDouble=double_Value CopyMemory mem_Buffer+mem_Offset, VARPTR(MDouble), 8 END SUB SUB Poke_Long(mem_Buffer AS LONG, mem_Offset AS LONG, long_Value AS LONG) MLong=long_Value CopyMemory mem_Buffer+mem_Offset, VARPTR(MLong), 4 END SUB SUB Poke_Word(mem_Buffer AS LONG, mem_Offset AS LONG, word_Value AS WORD) MWord=word_Value CopyMemory mem_Buffer+mem_Offset, VARPTR(MWord), 2 END SUB SUB Poke_Byte(mem_Buffer AS LONG, mem_Offset AS LONG, byte_Value AS BYTE) MByte=byte_Value CopyMemory mem_Buffer+mem_Offset, VARPTR(MByte), 1 END SUB SUB Alloc_DefaultMemory(mem_Type AS LONG, bufsize AS LONG) mem_Lock=0 mem_Memory=0 mem_Block=0 mem_Memory=GlobalAlloc(mem_Type, bufsize) IF mem_Memory<>0 THEN mem_Lock=GlobalLock(mem_Memory) IF mem_Lock<>0 THEN mem_Block=mem_Lock 'MEM ALLOCATED AND LOCKED ELSE 'MEM NOT LOCKED END IF ELSE 'MEM NOT ALLOCATED END IF END SUB ' Allocate a default buffer for General Use. Alloc_DefaultMemory(GMEM_MOVEABLE OR GMEM_ZEROINIT, 500) Poke_Byte(mem_Block, 0, 124) Poke_Word(mem_Block, 2, 65530) Poke_Long(mem_Block, 10, &H7FFFFFFF) Poke_Double(mem_Block, 14, 1.824) Poke_String(mem_Block, 26, "Hello", 5) Peek_Byte(mem_Block, 0) Peek_Word(mem_Block, 2) Peek_Long(mem_Block, 10) Peek_Double(mem_Block, 14) Peek_String(mem_Block, 26, 5) PRINT "Byte: "+STR$(MByte) PRINT PRINT "Word: "+STR$(MWord) PRINT PRINT "Long: "+CONVBASE$(HEX$(MLong), 16, 10) PRINT PRINT "Double: "+STR$(MDouble) PRINT PRINT "String: "+MString$ PRINT PRINT "String: "+MString_Buffer$ UnLock_DefaultMemory Free_DefaultMemory SLEEP 4444