Sección de tutoriales y manuales vb

Tutorial Api - Parte 3

Parte 1 - Parte 2 - Parte 3



 

 

API GlobalMemoryStatus para obtener información de la memoria del sistema

 

 

Con la función Api GlobalMemorySatus podemos obtener información de la memoria del sistema, ya sea la memoria libre, la memoria usada, el total de la memoria física y el estado de la memoria swap o archivo de intercambio de windows (memoria virtual)

Para poder utilizar esta función es necesario declarar junto con la función Api GlobalMemorySatus, una estructura de datos de tipo MEMORYSTATUS

 

La declaración de la función Api y la estructura de datos mencionada es la siguiente:

 

 

'Api GlobalMemoryStatus
Private Declare Function GlobalMemoryStatus Lib "Kernel32" (lpBuffer As MEMORYSTATUS) As Long

'Type o estructura para usar con GlobalMemoryStatus
Private Type MEMORYSTATUS

dwLength As Long
dwMemoryLoad As Long
dwTotalPhys As Long
dwAvailPhys As Long
dwTotalPageFile As Long
dwAvailPageFile As Long
dwTotalVirtual As Long
dwAvailVirtual As Long

End Type

 

Como podemos ver la función tiene una estructura de datos definida.
El campo o variable dwLength no nos retorna un valor de información específica sobre el estado de la memoria. Esta variable es necesaria cargarla antes de llamar a la función para que nos devuelva los valores que queremos obtener sobre la memoria.
si no cargamos esta variable antes de llamar a la función, esta función no funcionará.

 

Programa de ejemplo:

 

vista previa del programa de ejemplo que utiliza el Api globalmemorystatus para obtener información de la memoria de windows

Antes de comenzar vamos a describir en que consiste este ejemplo.

En un formulario colocaremos una serie de controles Labels que nos informarán sobre el estado de la memoria. Los datos a mostrar serán:

  1. Agrega 4 controles Labels. Uno que diga Memoria libre disponible, otro Memoria física total, otro Memoria física disponible y el último Archivo de paginación. Al costado del Label Memoria Disponible coloca un Label1, al costado de Memoria Física total un Label2, en el otro un Label3 y en el último un Label4 (Estos 4 Labels mostrarán los datos)
  2. Coloca un botón de comando que lo utilizaremos para refrescar o actualizar los datos de la memoria con el Caption "Mostrar Memoria".
  3. Coloca 2 controles Shape como está en la imagen para mostrar el porcentaje (Shape1 y Shape2)

 

El código completo:

'Función GlobalMemoryStatus
Private Declare Function GlobalMemoryStatus Lib "Kernel32" (lpBuffer As MEMORYSTATUS) As Long

'type GlobalMemoryStatus
Private Type MEMORYSTATUS

dwLength As Long
dwMemoryLoad As Long
dwTotalPhys As Long
dwAvailPhys As Long
dwTotalPageFile As Long
dwAvailPageFile As Long
dwTotalVirtual As Long
dwAvailVirtual As Long

End Type

Private Sub Command1_Click()
MostrarMemoria
End Sub

Private Sub MostrarMemoria()
'Variable de tipo MEMORYSTATUS para obtener los datos devueltos por la función api
Dim memoria As MEMORYSTATUS
'variable de retorno
Dim retorno As Long

Dim porcentaje As Integer

memoria.dwLength = Len(memoria)
retorno = GlobalMemoryStatus(memoria)

porcentaje = 100 - memoria.dwMemoryLoad

Label1 = Format(porcentaje, "00.0") & "%"

Shape2.Width = 1935 / 100 * porcentaje 'Mostramos el porcentaje representado en el control Shape

'Mostramos la información en los labels devueltos
Label2 = Format(memoria.dwTotalPhys / 1000000, "00.0") & " MB" 'Memoria total
Label3 = Format(memoria.dwAvailPhys / 1000000, "00.0") & " MB" 'Memoria libre
Label4 = Format((memoria.dwTotalPageFile - memoria.dwAvailPageFile) / 1000000, "00.0") & " MB" 'Memoria Virtual

End Sub

Private Sub Form_Load()
'Llamamos a la sub
MostrarMemoria

Command1.Caption = "Mostrar memoria"

End Sub

 

Descripción del código:


En la línea Dim memoria As MEMORYSTATUS creamos una variable de tipo MEMORYSTATUS para luego poder acceder a los valores que retorne la función Api.

En la línea Dim porcentaje As Long creamos una variable que contendrá el porcentaje de la memoria libre

En la líneamemoria.dwLength = Len(memoria) cargamos la variable dwLength con el tamaño de la estructura antes de llamar a la función

En esta línea llamamos a la función GlobalMemoryStatus
retorno = GlobalMemoryStatus(memoria)

en porcentaje = 100 - memoria.dwMemoryLoad estamos asignando a la variable porcentaje la memoria libre del sistema. como el valor dwMemoryLoad lo devuelve en un número que es el porcentaje real de memoria, para obtener el porcentaje de memoria libre le restamos a 100 el valor de la memoria leída.

En la líneaLabel2 = Format(porcentaje, "00.0") & "%" asignamos al label2 el valor del porcentaje de memoria pero con el formato con un dígito después del decimal y le agregamos el caracter de porcentaje.

Para mostrar una barra de porcentaje que indíque la memoria libre,se agregan 2 controles shape. Colocando un control shape1 sin relleno, o sea que se vea solo el contorno del mismo, . Luego agrega otro shape2 exactamente del mismo tamaño y lo colocas justo encima del otro shape1, pero a este le pones un color de fondo que sea sólido. luego pega este código:

En la línea

Label3 = Format(memoria.dwTotalPhys / 1000000, "00.0") & " MB"

Obtenemos el valor de la memoria física total del sistema. Como todos los valores retornados por la función api están expresados en bytes nosotros lo convertiremos a Megabytes . Luego le aplicamos el formato como lo hemos hecho en la línea anterior.

La linea

Label4 = Format(memoria.dwAvailPhys / 1000000, "00.0") & " MB"  

obtenemos la memoria física disponible

En la última línea obtenemos la memoria utilizada por el archivo de intercambio o archivo de paginación

Por último para refrescar los datos , en el command1 en el evento Click volvemos a ejecutar al procedimiento MostrarMemoria, con esto llamamos nuevamente a la rutina y los datos se actualizan.


Ejemplo del api GetDiskFreeSpaceEx para sabe la espacio de las unidades de disco

 

Ahora un programa de ejemplo que nos permita ver la capacidad de los discos duros de nuestra pc, el espacio utilizado en Megas, el porcentaje utilizado, el porcentaje libre y una barra de gráfico hecha con un control shape, para que nos muestre los porcentaje pero en forma gráfica, como en el ejemplo anterior

para ello utilizaremos la función GetDiskFreeSpaceEx

Imagen previa del ejemplo:

 

Función Api GetDiskFreeSpaceEx para  obtener información sobre el espacio de las unidades

 

Aunque la función para ser muy complicada a simple vista, es muy sencilla de utilizar.

La declaración completa de GetDiskFreeSpaceEx es la siguiente:

'Api GetDiskFreeSpaceEx
Private Declare Function GetDiskFreeSpaceEx Lib "Kernel32" Alias "GetDiskFreeSpaceExA" (ByVal RootPathName As String, lpFreeBaytesAvailableToCaller As Currency, lpTotalNumberofBytes As Currency, lpTotalNumberofFreeBytes As Currency) As Long

 

Esta función Api que se encuentra en el núcleo del sistema operativo, tiene 4 parámetros.

En el primero debemos enviarle una cadena o variable que indique la unidad a la cual queremos obtener información, ya sea un disco duro o una partición, una unidad de disquete, un cd-rom, etc... . Osea es un dato de tipo string, por ejemplo "c:"

El segundo parámetro al igual que el ultimo, nos devolverá un número que representa el espacio libre en disco. La variable que debemos enviar aquí debe ser de tipo Currency (entero de 64 bits), ya que si enviamos una de tipo entero largo (Long de 32 bits, nos daría un error de desbordamiento). esto sucede por que la función devuelve el número de bytes libres expresado en bytes, y hoy en día los discos duros suelen ser muy grandes, por lo cual nos devolvería un número gigante que no podría caber en una variable de tipo Double

Nota : Estos 2 parámetros devuelven el espacio total y parecen ser exactamente iguales aunque con una diferencia.
El parámetro 2 (lpFreeBaytesAvailableToCaller) devolverá el espacio libre de la unidad del usuario que hace la llamada a la función, por que por ejemplo si tenemos un disco compartido tal vez no muestre el valor real del espacio libre de la unidad, si no el espacio libre que tengo asignado para mí o para el usuario que la llama.
El cuarto parámetro (lpTotalNumberofFreeBytes) nos devuelve el espacio libre sin tomar en cuenta la aclaración anterior. en este ejemplo nosotros trabajaremos con el valor retornado del 4 parámetro (lptotalnumberoffreebytes)

El tercer parámetro nos va a devolver el espacio total de la unidad.

 

Pasos a seguir:

 

  1. Crea un nuevo proyecto y en el formulario agrega 5 controles Labels. El Label1 mostrará la capacidad total de la unidad, el Label2 el Espacio Utilizado, y así con los restantes como muestra el gráfico
  2. Agrega un control Drive1 (para seleccionar la unidad)
  3. Dos controles shape (Shape1 y Shape2), como está en la imagen previa.
  4. Copia y pega el código completo del programa:

 

'Función Api GetDiskFreeSpaceEx
Private Declare Function GetDiskFreeSpaceEx Lib "Kernel32" Alias "GetDiskFreeSpaceExA" (ByVal RootPathName As String, lpFreeBaytesAvailableToCaller As Currency, lpTotalNumberofBytes As Currency, lpTotalNumberofFreeBytes As Currency) As Long

Private Sub Drive1_Change()

MostrarDatos

End Sub

Private Sub MostrarDatos()

On Error GoTo mensaje

Dim Disco As String
Dim Capacidad As Currency
Dim Libre As Currency
Dim PorcentajeUsado As Currency
Dim PorcentajeLibre As Currency
Dim retorno As Long

Disco = Left(Drive1.Drive, 2)
retorno = GetDiskFreeSpaceEx(Disco, Libre, Capacidad, Libre)

Capacidad = Capacidad * 10000 / 1000000
Libre = Libre * 10000 / 1000000

Label1 = Format(Capacidad, "0.00") & " MegaBytes"
Label2 = Format(Capacidad - Libre, "0.00") & " MegaBytes Usados"
Label3 = Format(Libre, "0.00") & " MegaBytes Libres"

PorcentajeLibre = Libre * 100 / Capacidad
Label4 = Format(PorcentajeLibre, "0.00") & " % de Bytes Libres"

PorcentajeUsado = (Capacidad - Libre) * 100 / Capacidad
Label5 = Format(PorcentajeUsado, "0.00") & " % de Bytes Utilizados"

Shape2.Width = 4695 / 100 * PorcentajeLibre

Exit Sub

mensaje:

MsgBox "Compruebe que la unidad accedida esté disponible", vbInformation + vbOKOnly, "error al acceder a la unidad"

End Sub

 

Descripción del código:


1 - Descripción de las variables del ejemplo: la variable disco de tipo string es la que almacenará la unidad seleccionada en el control Drive1. Mas abajo, en la línea que dice:
Disco = Left(Drive1.Drive, 2)
lo que hacemos es extraer solo la letra de la unidad y los 2 puntos (ejemplo: c:), para poder pasársela correctamente a la función. Si le pasáramos el valor del drive, nos daría error por que el DriveListBox, en la mayoría de los casos muestra la unidad con el nombre del volumen de la misma, y la api no aceptaría este valor.

2 - Las variables capacidad y libre de tipo Currency, son las que enviaremos a la función Api para que nos devuelva el valor del espacio total y el espacio libre de la unidad respectivamente.

3 - Las variables porcentajelibre y porcentajeusado almacenarán luego de una operación , los valores respectivos.

4 - En el evento Change del control Drive1, llamamos a la Sub Mostrardatos para llamar al procedimiento de código cada vez que seleccionemos o cambiemos la unidad.

5 - En la línea Capacidad = Capacidad * 10000 / 1000000 lo que hacemos es convertir el número. Primero debemos multiplicarlo por 10000 para obtener el valor real. Luego lo dividimos por 1000000 para que el número quede expresado en MegaBytes(1 millón)

6 - Luego en la línea
Label1 = Format(Capacidad, "0.00") & " MegaBytes"
asignamos al control Label1 el valor ya convertido de la variable capacidad y lo formateamos correctamente.

7 - En la línea
Label2 = Format(Capacidad - Libre, "0.00") & " MegaBytes Usados"
estamos asignando el espacio o megas usados. Para esto hacemos la resta entre el espacio total y el espacio libre. Después le damos el formato correcto.

8 - La línea
PorcentajeLibre = Libre * 100 / Capacidad
utiliza una regla de tres para obtener el espacio libre pero en porcentaje. Lo mismo hacemos con la variable porcentajeUsado

9 - luego asignamos a los Label4 (bytes libres) y Label5 (bytes usados) los valores de las variables anteriores.

10 - Para mostrar una barra de gráfico utilizamos 2 controles shape del mismo tamaño uno encima del otro. El shape1 no tiene que tener color de fondo.

Aclaración: en la línea :
shape2.width = 4695 / 100 * porcentajelibre

donde dice 4695, se refiere al ancho que tenga tu control shape.

Para descargar el zip con el ejemplo:

Obtener el espacio de las unidades - Api GetDiskFreeSpaceEx

 

Enlace relacionado :

Mostrar el espacio libre y espacio utilizado de una unidad en forma gráfica usando el control MsChart

Obtener información de una unidad con File system Object - Fso

 


Saber la versión de Windows y el directorio de instalación - GetVersionEx y GetwindowsDirectory

 

En esta sección vamos a utilizar 2 funciones Api para obtener información del sistema operativo. Con la función GetVersionEx podemos recuperar la plataforma y versión de windows; y para conocer el directorio donde se encuentra instalado el mismo vamos a utilizar la función api GetWindowsDirectory.

 

 

Para obtener el directorio donde se encuentra instalado windows, no necesitamos declarar junto a la Api ninguna estructura de datos ni constantes. Lo que debemos pasar en el primer parámetro de la función, es una variable de tipo String para almacenar el path o ruta del directorio. Pero justo antes de pasar esta variable hay que rellenar la misma con espacios vacíos con la función space de visual basic.

Luego en el segundo parámetro debemos establecer el tamaño de la misma, pasando en este caso como valor el número 255.

Para obtener la plataforma y la versión de windows, usando la función GetVersionEx, y debemos declarar una estructura de datos de tipo OSVERSIONINFO que tiene 6 campos o variables definidas.
De estas variables la que retorna el número de serie y la plataforma son las siguientes:


dwMajorInfoSize : esta variable nos retornará el primer valor de la versión de windows, por ejemplo si tengo instalada la versión 4.10, esta variable almacenará el número 4.

dwMinorInfoSize: esta variable almacenará el segundo número, siguiendo el ejemplo anterior almacenará el número 10. luego para mostrar el número de versión completo juntamos las 2 variables.

dwPlatformId : esta variable nos retornará un número que representará la plataforma de windows. Si retorna el 0 o el 1, se tratará de una plataforma de win32 bits, si retorna un 2 se tratará de una versión de windows de tipo NT.

La única aclaración importante antes de usar esta función, es que debemos cargar en la variable dwOSVersionInfoSize As Long el tamaño de la estructura de datos antes de llamar a la función Api, utilizando la función Len de visual basic

'Declaración del Api GetVersionEx
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
'Declaración del Api GetWindowsDirectory
Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

'Estructura OSVERSIONINFO para utilizar con las funciones anteriores
Private Type OSVERSIONINFO

dwOSVersionInfoSize As Long
dwMajorInfoSize As Long
dwMinorInfoSize As Long
dwPlatformId As Long
dwBuildNumber As Long
szCSDVersion As String * 128

End Type

Private Sub Command1_Click()
End
End Sub

Private Sub Form_Load()

'OBTENER LA PLATAFORMA Y LA VERSIÓN DE WINDOWS
Dim retorno As Long ' vARIABLE DE RETORNO DE LA FUNCIÓN API
Dim windows As OSVERSIONINFO ' NUESTRA VARIABLE PARA ALMACENAR LOS DATOS DE LA ESTRUCTURA OSVERSIONINFO
Dim directorio As String * 255 ' VARIABLE DE CADENA FIJA PARA ALMACENAR EL DIRECTORIO DE WIN

windows.dwOSVersionInfoSize = Len(windows) 'CARGAMOS EN ESTA VARIABLE, EL TAMAÑO DE LA ESTRUCTURA, ANTES DE LLAMAR A LA FUNCIÓN
retorno = GetVersionEx(windows) ' LLAMAMOS A LA FUNCIÓN
Label3 = Format(windows.dwMajorInfoSize & "." & windows.dwMinorInfoSize, "0.00")
Label2 = windows.dwPlatformId

'OBTENER EL DIRECTORIO
directorio = Space(255) ' RELLENAMOS A LA VARIABLE CON ESPACIOS
retorno = GetWindowsDirectory(directorio, 255) ' LLAMAMOS A LA FUNCIÓN
Label4 = Trim(directorio) ' LE QUITAMOS LOS ESPACIOS VACIOS DE AMBOS LADOS

End Sub


Api parte 1 - Api parte 2 - Api parte 3

 

 


Buscar en Recursos vb