Page 1 of 1

nExtMem() and Os()

Posted: Mon Feb 22, 2016 1:23 pm
by sambomb
nExtMem() isn't returning the correct amount of memory and the OS() function doensn't work in windows 8 or above, returning windows NT instead

Is this related to my FWH / xHarbour version?

Compiler version: xHarbour build 1.2.1 Intl. (SimpLex) (Rev. 6715)
FiveWin Version: FWHX 10.6

Re: nExtMem() and Os()

Posted: Mon Feb 22, 2016 1:38 pm
by karinha

Code: Select all

// GETSYSIN.PRG

#include "FiveWin.ch"

#define HORZRES             8
#define VERTRES            10
#Define BITSPIXEL          12
#define PLANES             14
#define LOGPIXELSX         88
#define LOGPIXELSY         90    

//----------------------------------------------------------------------------//

Function LargeFonts( nPixelX, nPixelY )

  Local hDC

  hDC     := CreateDC( "DISPLAY", "", "" )
  nPixelX := GetDeviceCaps( hDC, LOGPIXELSX )
  nPixelY := GetDeviceCaps( hDC, LOGPIXELSY )

  DeleteDC( hDC )

Return ( nPixelX >= 120 )

//----------------------------------------------------------------------------//

function DispFontPerSize()

   local hDC, nPixelX

   hDC     = CreateDC( "DISPLAY", "", "" )
   nPixelX = GetDeviceCaps( hDC, LOGPIXELSX )

   DeleteDC( hDC )

return ( nPixelX / 96 )

//----------------------------------------------------------------------------//

function ColorsQty()

   local hDC, nPlanes, nBitsPixel

   hDC        = CreateDC( "DISPLAY", "", "" )
   nPlanes    = GetDeviceCaps( hDC, PLANES )
   nBitsPixel = GetDeviceCaps( hDC, BITSPIXEL )

   DeleteDC( hDC )

return Int( 2 ^ ( nPlanes * nBitsPixel ) )

//----------------------------------------------------------------------------//

function ScrResolution( nWidth, nHeight )

   local hDC

   hDC     = CreateDC( "DISPLAY", "", "" )
   nWidth  = GetDeviceCaps( hDC, HORZRES )
   nHeight = GetDeviceCaps( hDC, VERTRES )

   DeleteDC( hDC )

return { nWidth, nHeight }

//----------------------------------------------------------------------------//

#ifdef __CLIPPER__

function cWinVersion()

   local cVersion := ""

   If IsWin95()
      cVersion = "95"

   elseif IsWinNT()
      if GetWinVer()[ 2 ] == 95
         cVersion = "2000"
      else
         cVersion = "NT"
      endif
   endif

return cVersion

#else

#define VER_PLATFORM_WIN32s         0
#define VER_PLATFORM_WIN32_WINDOWS  1
#define VER_PLATFORM_WIN32_NT       2

function cWinVersion()

   local aVersion := GetVersion()
   local cVersion := ""

   do case
      case aVersion[ 4 ] == VER_PLATFORM_WIN32_NT
           if aVersion[ 1 ] == 6
             if aVersion[ 2 ] == 0
                cVersion = "Vista"
             elseif aVersion[ 2 ] == 1
                cVersion = "7"
             elseif aVersion[ 2 ] == 2
                if IsWindows10()                 
                   cVersion = "10"
                else                         
                   cVersion = "8"   
                endif                            
             endif
           endif  
                 
           if aVersion[ 1 ] == 5
              if aVersion[ 2 ] == 2
                 cVersion = "Server 2003"
              elseif aVersion[ 2 ] == 1
                 cVersion = "XP"
              elseif aVersion[ 2 ] == 0
                 cVersion = "2000"
              endif
           endif

           if aVersion[ 1 ] <= 4
              cVersion = "NT"
           endif

      case aVersion[ 4 ] == VER_PLATFORM_WIN32_WINDOWS
           if aVersion[ 1 ] == 4
              if aVersion[ 2 ] == 90
                 cVersion = "ME"
              elseif aVersion[ 2 ] == 10
                 cVersion = "98"
              elseif aVersion[ 2 ] == 0
                 cVersion = "95"
              endif
           endif
   endcase

   cVersion += IF( IsWin64(), " de 64 ", " de 32 " ) + "Bits"

return cVersion

#endif

//----------------------------------------------------------------------------//

function IsWinVista()

return ( "Vista" $ cWinVersion() )

//----------------------------------------------------------------------------//

function IsWinXP()

return ( "XP" $ cWinVersion() )

//----------------------------------------------------------------------------//

function IsWin2000()

return ( "2000" $ cWinVersion() )

//----------------------------------------------------------------------------//

function IsWin7()

return "7" $ cWinVersion()

//----------------------------------------------------------------------------//

function IsWin8()

return "8" == cWinVersion()

//----------------------------------------------------------------------------//

#define  HKEY_LOCAL_MACHINE  2147483650  // 0x80000002

function IsWindows10()

   local oReg := TReg32():New( HKEY_LOCAL_MACHINE,;
                               "SOFTWARE\Microsoft\Windows NT\CurrentVersion",;
                               .f. )
   local cProductName := oReg:Get( "ProductName" )

   oReg:Close()

return "Windows 10" $ cProductName

//----------------------------------------------------------------------------//

function GetSysFont()

   do case
      case ! IsWinNt() .and. ! IsWin95()  // Win 3.1
           return "System"

      #ifdef __CLIPPER__   // A.L. 28/04/03, It fails with FWH/FW++
         case IsWin2000()  // Win2000
              return "Ms Sans Serif" // "SysTahoma"
      #endif

   endcase

return "Ms Sans Serif"  // Win NT, 9x

//----------------------------------------------------------------------------//

function BorlandVersion()
   
   #ifdef __XHARBOUR__
      local cHexVer := NumToHex( BorlandC() )
   #else   
      local cHexVer := hb_NumToHex( BorlandC() )
   #endif

return SubStr( cHexVer, 1, 1 ) + "." + SubStr( cHexVer, 2 )

//----------------------------------------------------------------------------//

function SaveDesktop( cPngFileName )

   local o := TWindow()
   
   DestroyWindow( o:hWnd )
   o:hWnd = GetDesktopWindow()
   o:SaveToPng( cPngFileName )
   
return nil

//----------------------------------------------------------------------------//  

#define SM_CXFULLSCREEN  16
#define SM_CYFULLSCREEN  17

function ScreenWidth()

return GetSysMetrics( SM_CXFULLSCREEN )

function ScreenHeight()

return GetSysMetrics( SM_CYFULLSCREEN )

//----------------------------------------------------------------------------//   

function IsWin64()

return ! Empty( GetEnv( "ProgramFiles(x86)" ) )

//----------------------------------------------------------------------------//
 

Re: nExtMem() and Os()

Posted: Mon Feb 22, 2016 2:24 pm
by sambomb
Gostaria de utilizar a função OS pois ela já retorna o modelo do SO também pois alguns modelos geram incompatibilidade, como o windows 7 starter...

? "Versão windows: " + OS() //Versão windows: Windows 7 Professional 6.01.7601 Service Pack 1

Re: nExtMem() and Os()

Posted: Mon Feb 22, 2016 2:47 pm
by karinha
sambomb wrote:Gostaria de utilizar a função OS pois ela já retorna o modelo do SO também pois alguns modelos geram incompatibilidade, como o windows 7 starter...

? "Versão windows: " + OS() //Versão windows: Windows 7 Professional 6.01.7601 Service Pack 1
look, mira, olha:

http://forums.fivetechsupport.com/viewt ... em#p185657

http://fivewin.com.br/index.php?/topic/ ... ntry272884

http://fivewin.com.br/index.php?/topic/ ... hl=nextmem

Regards, saludos.

Re: nExtMem() and Os()

Posted: Tue Feb 23, 2016 11:33 am
by sambomb
a nExtMem está retornando valores inválidos, minha máquina é um Windows 7 que tem 4 GB ( utilizável 3,24 ) sendo que reconhece apenas 2 GB em uma máquina com Windows 8.1, reconhece como negativo!
E a função Os() é nativa do xHarbour, mas parece que não foi atualizada, ela retorna todas as informações que eu preciso, queria saber não apenas a versão do Windows, mas também o tipo de licença dele como disse acima, mas muito obrigado, estou desenvolvendo uma rotina que poderei aproveitar trechos dessa TSystem

Re: nExtMem() and Os()

Posted: Tue Feb 23, 2016 2:04 pm
by karinha
Windows 8.1, reconhece como negativo?

Você incorporou o GETSYSIN.PRG modificado por mim, logo acima?

Você tem a função Os() do xHarbour? Talvez o Marcelo Lombardo tenha uma mais recente.

Seria algo assim?

http://www.pctoledo.com.br/forum/viewto ... =4&t=16163

Abs.

Re: nExtMem() and Os()

Posted: Wed Feb 24, 2016 11:32 am
by sambomb
Não só no Windows 8.1

--> DadosSO

Versão windows: Windows 7 Professional 6.01.7601 Service Pack 1
Processador: AMD Athlon(tm) II X2 250 Processor 3017 Mhz
Data: 23/02/2016
Hora: 14:30:07
Nome de rede: LAZZO-PC
Usuário de rede: Lazzo
Acesso de gravação no 'C:\': True
Driver's ( 1 )
C: Serial: 4873455 Tamanho total: 465.662 GB Utilizado: 61.306 GB Restante: 404.356 GB
Cache HD: Cache não habilitado
Arquivos off-line: Desabilitado

Code: Select all

aAdd( ::aTexto,"Memória: " + cValToChar( Int( nExtMem() / ( 1024 * 1024 ) ) + 1 ) + " MBs" )
Memória: -255 MBs
Memória livre - Sistema: 90 %
Memória livre - GDI: 90 %
Memória livre - User: 90 %

Re: nExtMem() and Os()

Posted: Wed Feb 24, 2016 2:50 pm
by Carlos Mora
Don't know about xHarbour, but probably this is sth related to the numeric type used by nExtMem() an xHabour's integers. Using a 4 byte UNSIGNED LONG we can represent integers from 0 to 256^4-1, or 4,294,967,295, or SIGNED, ranging from -2,147,483,647 TO 2,147,483,648. I think the function is working fine, but returning an UNSIGNED LONG that xHarbour is handling as signed, so that's why you ar getting negative results. A quick temporary patch can be that, in case of a negative result, it should be substracted from 256^4-1, wich will result in your case to 3840 Mb, that is your claimd free mem.
Obvously, this patch will fail in PC with more than 4 GB, as probably will do anything in 32 bits with results expresing byte counts that a 4 byte LONG won't be able to represent.

Re: nExtMem() and Os()

Posted: Wed Feb 24, 2016 3:48 pm
by karinha

Code: Select all

#include "FiveWin.ch"

function Main()

   LOCAL cMemoria, nBytes, nKBytes, nMBytes, nGBytes

   nBytes  := nExtMem()
 
   nKBytes := nBytes / 1014
 
   nMBytes := nKBytes / 1024
 
   nGBytes := nMBytes / 1014

   // Com erro - With Error
   //  aAdd( ::aTexto,"Memória: " + cValToChar( Int( nExtMem() / ( 1024 * 1024 ) ) + 1 ) + " MBs" )
   ? ( "Memóry Error: " + cValToChar( Int( nExtMem() / ( 1024 * 1024 ) ) + 1 ) + " MBs" )

   ? cMemoria := Trans( nExtMem(), "@E 9,999,999,999 Bytes free" )

   ? cMemoria := Trans( ( nExtMem() / ( 1024 * 1024 * 1014 ) ), "@E 999.99 GB Free" )

                                                       // or .97 = 4 Gbs.
   ? cMemoria := Trans( ( nExtMem() / ( 1024 * 1024 * 1014 ) + 1 ), "@E 999.99 GB Total" )

RETURN NIL

// END OF PROGRAM