Vous êtes sur la page 1sur 3

API de Windows

Revisin del Sistema.


Echamos un vistazo a llamadas del API de Windows y que nos oriente.
Jose Luis Freire

Cuando trabajamos en una aplicacin a medida, podemos presuponer y en consecuencia anticiparnos, si es posible, a los cambios que se puedan producir en los equipos, de manera que no quedemos obsoletos en poco tiempo. Cuando por el contrario se crea un producto de salida masiva las posibilidades se reducen, podemos observar el sistema y obrar en consecuencia, o simplemente, crear una ventana de informacin al usuario sobre el estado de su propio equipo informtico. Vamos a centrarnos en las tres principales llamadas al API, que por supuesto no son las nicas, aunque s las que parecen de mayor inters, definidas en el mdulo Windows.pas.

- dwLength. Describe la longitud del registro. Es importante pasarlo a la variable que vayamos a utilizar a travs de la funcin SizeOf() - dwMemoryLoad. Nos devuelve el porcentaje de la memoria que se est utilizando. - dwTotalPhys. Cantidad de memoria RAM y dwAvailPhys que informa que parte est disponible. - dwTotalPageFile. Cantidad de almacenamiento en los ficheros en el disco duro, y dwAvailPageFile la que hay disponible. - dwTotalVirtual. Memoria virtual utilizada por el proceso y dwAvailVirtual memoria virtual dispobible. Veamos un ejemplo en el listado 1. El motivo de introducir los valores en un StringGrid no es significativo, cuestin de gustos.

GlobalMemoryStatus.
Nos ser til para obtener informacin acerca del estado de las memorias. Este procedimiento utiliza exclusivamente un parmetro del tipo TmemoryStatus. Veamos su registro:
type PMemoryStatus = ^TMemoryStatus; _MEMORYSTATUS = record dwLength: DWORD; dwMemoryLoad: DWORD; dwTotalPhys: DWORD; dwAvailPhys: DWORD; dwTotalPageFile: DWORD; dwAvailPageFile: DWORD; dwTotalVirtual: DWORD; dwAvailVirtual: DWORD; end; {$EXTERNALSYM _MEMORYSTATUS} TMemoryStatus = _MEMORYSTATUS; MEMORYSTATUS = _MEMORYSTATUS; {$EXTERNALSYM MEMORYSTATUS} [...] procedure GlobalMemoryStatus(var lpBuffer: TMemoryStatus); stdcall; {$EXTERNALSYM GlobalMemoryStatus}

Listado 1. Obtencin de datos sobre memorias


procedure TForm1.Button1Click(Sender: TObject); var Memoria:TMemoryStatus; Evalor:Extended; begin // Datos de memoria Memoria.dwLength:=SizeOf(Memoria); GlobalMemoryStatus(Memoria); StringGrid1.Cells[0,1]:='Datos de Memorias'; // Oorcentaje del estado de la memoria StringGrid1.Cells[0,2]:='Memoria en uso'; EValor:=Memoria.dwMemoryLoad; StringGrid1.Cells[1,2]:=Format('%10n',[EValor]); // Cantidad total de RAM StringGrid1.Cells[0,3]:='Total de Memoria'; EValor:=Memoria.dwTotalPhys; StringGrid1.Cells[1,3]:=Format('%10n',[EValor]); // Cantidad total de RAM disponible StringGrid1.Cells[0,4]:='Total de Memoria'; EValor:=Memoria.dwAvailPhys; StringGrid1.Cells[1,4]:=Format('%10n',[EValor]); End;

Si lo analizamos vemos que todos los miembros del registro son del tipo Dword (word doble), con lo que ya sabemos que vamos a obtener un valor numrico de cada uno de ellos. Veamos cuales:

API de Windows
Revisin del Sistema.

No parece necesitar mucha explicacin. He creado la variable "Memoria" del tipo TmemoryStatus, pues es la que precisa el procedimiento, y trasladamos la longitud del registro a su valor en dwLength, como habamos dicho. El resto es tan simple como ir tomando aquellos valores que queramos mostrar, tan slo incluyo una variable Evalor del tipo Extended para recogerlos y darles un formato numrico de salida, que lo asigno a las celdas correspondientes.

95/98 y la tercera sobre NT/2000. Los valores correspondientes a dwBuildNumber me resultan una incgnita, as como la matriz szCSDVersion que localizo vaca, a pesar de que debera contener datos correspondientes a la versin, aunque no localizo informacin que indique cuales en concreto. Veamos en el Listado 2 la forma de obtener estos valores. Muy similar a lo que indicamos en el listado 1.

GetVersionEx
Util para cotillear un poco del Sistema Operativo Windows, aunque no de forma muy amplia. Volvamos a Windows.pas para saber de l:
POSVersionInfoA = ^TOSVersionInfoA; POSVersionInfoW = ^TOSVersionInfoW; POSVersionInfo = POSVersionInfoA; _OSVERSIONINFOA = record dwOSVersionInfoSize: DWORD; dwMajorVersion: DWORD; dwMinorVersion: DWORD; dwBuildNumber: DWORD; dwPlatformId: DWORD; szCSDVersion: array[0..127] of AnsiChar; { Maintenance string for PSS usage } end; [...] function GetVersionEx(var lpVersionInformation: TOSVersionInfo): BOOL; stdcall; {$EXTERNALSYM GetVersionEx}

Listado 2. Sistema Operativo


procedure TForm1.Button1Click(Sender: TObject); var versionSO:TOSVersionInfo; Cvalor:Cardinal; Evalor:Extended; begin //Datos de Sistema Operativo VersionSO.dwOSVersionInfoSize:=SizeOf(VersionSO); GetVersionEx(VersionSO); StringGrid1.Cells[0,6]:='Datos del Sistema'; // Versin StringGrid1.Cells[0,7]:='Versin'; EValor:=VersionSO.dwMajorVersion; StringGrid1.Cells[1,7]:=Format('%2n',[EValor]); // Plataforma StringGrid1.Cells[0,8]:='Plataforma'; CValor:=VersionSO.dwPlatformId; case Cvalor of 0 : StringGrid1.Cells[1,8]:='Windows 3.x'; 1 : StringGrid1.Cells[1,8]:='Windows 95/98'; 2 : StringGrid1.Cells[1,8]:='Windows NT/2000'; end; end;

Repasemos el registro: - dwOSVersionInfoSize. Contiene el tamao del registro. Volveremos a utilizarlo con SizeOf(). - dwMajorVersion y wMinorVersion utilizadas conjuntamente, proporcionan el nmero de la versin, la primera es el entero, la segunda el decimal. Por ejemplo la versin 4.2, donde 4 sera el valor de retorno de dwMajorVersion y 2 el de
wMinorVersion.

Si pretendemos conocer el procesador, este se encuentra en las constantes definidas en dwPlatformId


{ dwPlatformId defines } const VER_PLATFORM_WIN32s = 0; {$EXTERNALSYM VER_PLATFORM_WIN32s} VER_PLATFORM_WIN32_WINDOWS = 1; {$EXTERNALSYM VER_PLATFORM_WIN32_WINDOWS} VER_PLATFORM_WIN32_NT = 2; {$EXTERNALSYM VER_PLATFORM_WIN32_NT}

El procedimiento GetVersionEx() precisa una variable del tipo TOSVersionInfo que he denominado "versionSO" y me he permitido el lujo de crear otra de tipo cardinal tan slo para la estructura Case. Creo que no hay ms que decir sobre este tema.

Otras llamadas.
Entiendo que la principal de ellas podra ser TsystemInfo, dirigida al procesador, pero al hacer pruebas encuentro que se debi de crear en pocas de relaciones doradas entre Microsoft e Intel, pues si bien en sta ltima marca reconoce perfectamente el procesador, el mismo ejecutable en AMD arroja unos resultados poco crebles. Se encuentra definida como todas ellas en Windows.pas y su forma de uso, tal como se refleja en el Listado 3 es igual a las anteriores, por lo que omito la declaracin de variables.

Como se ver, solamente tenemos tres valores definidos como tres constantes, la primera indica una plataforma Win32 sobre Windows 3.x, la segunda sobre Windows

API de Windows
Revisin del Sistema.

Listado 3. Procesador.
GetSystemInfo(Sistema); StringGrid1.Cells[0,9]:='Procesador'; CValor:=Sistema.wProcessorLevel; case Cvalor of 3 : StringGrid1.Cells[1,9]:='80836'; 4 : StringGrid1.Cells[1,9]:='80486'; 5 : StringGrid1.Cells[1,9]:='Pentium'; 6 : StringGrid1.Cells[1,9]:='Superior'; end; StringGrid1.Cells[0,10]:='revisin del Procesador'; EValor:=Sistema.wProcessorRevision; StringGrid1.Cells[1,10]:=Format('%10n',[EValor]);

la revisin concreta del procesador, que no obstante devuelve valores extraos nuevamente en modelos de otros fabricantes, al menos con AMD, en cambio s son lgicos en procesadores Pentium. Si vemos el registro podemos observar que localiza el nmero de ellos que tenga el ordenador instalado, como es el caso de dwActiveProcessorMask o dwNumberofProcessor. Lamentablemente no me es posible comprobar si es cierto su funcionamiento, no dispongo de varios procesadores ni sistema operativo Windows ni Delphi que los soporte.

De los miembros que componen su registro, entiendo de inters wProcessorLevel, que es quien devuelve el tipo de procesador que se est utilizando, pero como indico arriba, basndose en Intel. Tambin puede resultar de inters, y as lo he incluido en el listado, wProcessorRevision o

Vous aimerez peut-être aussi