>function api_memorystatus &&API function to retrieve memory information. >local lmemorystatus >*- Declare API function to retrieve memory information. >DECLARE GlobalMemoryStatus IN Win32API STRING @MemStat > >*- fLong2str() is passed a dwLength of 32; since structure is 32 bytes long. >*- This is appended to a 28 byte blank buffer; a total of 32 bytes. >cBuffer = fLong2str( 32 ) + REPLICATE( CHR(0), 28 ) >GlobalMemoryStatus( @cBuffer ) > >*- dwLength is 4 bytes, start extracting members at byte 5. >*- Each member is 4 bytes long. >nMemoryLoad = fStr2long( SUBSTR( cBuffer, 5, 4 )) >nTotalPhys = fStr2long( SUBSTR( cBuffer, 9, 4 )) / 1024 >nAvailPhys = fStr2long( SUBSTR( cBuffer, 13, 4 )) / 1024 > >nTotalPageFile = fStr2long( SUBSTR( cBuffer, 17, 4 )) / 1024 >nAvailPageFile = fStr2long( SUBSTR( cBuffer, 21, 4 )) / 1024 >nTotalVirtual = fStr2long( SUBSTR( cBuffer, 25, 4 )) / 1024 >nAvailVirtual = fStr2long( SUBSTR( cBuffer, 29, 4 )) / 1024 > >lmemorystatus = "Memory Load: " + TRANSFORM( nMemoryLoad, "999,999,999" ) + "%"+chr(13)+chr(10)+; > "Physical memory: " + TRANSFORM( nTotalPhys, "999,999,999" ) + "k"+chr(13)+chr(10)+; > "Available physical: " + TRANSFORM( nAvailPhys, "999,999,999" ) + "k"+chr(13)+chr(10)+chr(13)+chr(10)+; > "Paging file: " + TRANSFORM( nTotalPageFile, "999,999,999" ) + "k"+chr(13)+chr(10)+; > "Available paging file: " + TRANSFORM( nAvailPageFile, "999,999,999" ) + "k"+chr(13)+chr(10)+; > "Total virtual memory: " + TRANSFORM( nTotalVirtual, "999,999,999" ) + "k"+chr(13)+chr(10)+; > "Available virtual memory: " + TRANSFORM( nAvailVirtual, "999,999,999" ) + "k" > >?lmemorystatus >RETURN lmemorystatus > >****************************** >FUNCTION fLong2str( iLongVal ) >****************************** > *- passed : 32-bit non-negative "numeric" value (iLongVal). > *- returns : ASCII character representation of iLongVal in > *- LITTLE_ENDIAN format (least significant byte first). > LOCAL iBit, cResult > cResult = "" > FOR iBit = 24 TO 0 STEP -8 > *- Prepend new character to cResult. > cResult = CHR( INT( iLongVal / (2^iBit) )) + cResult > iLongVal = MOD( iLongVal, (2^iBit) ) > NEXT > RETURN cResult > ENDFUNC && flong2str( iLongVal ). > >*************************** >FUNCTION fStr2long( cLong ) >*************************** > *- passed: 4-byte character string (cLong) in LITTLE_ENDIAN format (least significant byte first). > *- returns: Long integer value. > LOCAL iBit, iResult > iResult = 0 > FOR iBit = 0 TO 24 STEP 8 > iResult = iResult + (ASC(cLong) * (2^iBit)) > cLong = RIGHT( cLong, LEN(cLong) - 1 ) > NEXT > RETURN iResult > ENDFUNC && fStr2long( cLong )>
FUNCTION getdiskspace && works like diskspace(), returns free,full or used > PARAMETERS m.lcdrive, m.lcdrivevalue > *!* PARAMETERS: > *!* m.lcDrive: Optional Assumes "C:\" OR > *!* Pass Drive parameter in this format "C:\" > *!* m.lcReturnValue: Optional Assumes "FREE" > *!* "FREE" = Free Drive Space > *!* "FULL" = Total Drive Space > *!* "USED" = Used Drive Space > > *!* RETURNS: Drive Size in Bytes based on Parameter passed > *!* OR Negitive One (-1) if an error > local m.nreturnvalue > STORE -1 TO m.nreturnvalue > *!* Check for What to return > IF TYPE("m.lcDriveValue") <> "C" > m.lcdrivevalue = "FREE" > ENDIF > *!* Check for drive to report on > IF TYPE("lcDrive") <> "C" > m.lcdrive = "C:\" > ELSE > m.lcdrive = UPPER(LEFT(ALLTRIM(m.lcdrive),1))+":\" > ENDIF > > lpFreeBytesAvailableToCaller = '' > lpTotalNumberOfBytes = '' > lpTotalNumberOfFreeBytes = '' > > DECLARE INTEGER GetDiskFreeSpaceEx IN kernel32 AS GetDiskFreeSpace ; > STRING , STRING @lpFreeBytesAvailableToCaller, STRING ; > @lpTotalNumberOfBytes, ; > STRING @lpTotalNumberOfFreeBytes > > lpFreeBytesAvailableToCaller = REPLICATE(CHR(0),8) > lpTotalNumberOfBytes = REPLICATE(CHR(0),8) > lpTotalNumberOfFreeBytes = REPLICATE(CHR(0),8) > > if GetDiskFreeSpace(m.lcdrive, @lpFreeBytesAvailableToCaller,@lpTotalNumberOfBytes, ; > @lpTotalNumberOfFreeBytes) > 0 > > lpFreeBytesAvailableToCaller = str2long(lpFreeBytesAvailableToCaller) > lpTotalNumberOfBytes = str2long(lpTotalNumberOfBytes) > lpTotalNumberOfFreeBytes = str2long(lpTotalNumberOfFreeBytes) > lpTotalBytesUsed = lpTotalNumberOfBytes- MAX(lpFreeBytesAvailableToCaller,lpTotalNumberOfFreeBytes) > DO CASE > CASE UPPER(m.lcdrivevalue) = "FREE" > m.nreturnvalue = MIN(lpFreeBytesAvailableToCaller,lpTotalNumberOfFreeBytes) > CASE UPPER(m.lcdrivevalue) = "FULL" > m.nreturnvalue = lpTotalNumberOfBytes > CASE UPPER(m.lcdrivevalue) = "USED" > m.nreturnvalue = lpTotalBytesUsed > ENDCASE > endif > GetDiskFreeSpace = .null. > release GetDiskFreeSpace > RETURN m.nreturnvalue >