Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Detectar capacidad total de varios módulos de memoria (https://www.clubdelphi.com/foros/showthread.php?t=79712)

Jose_Pérez 02-08-2012 14:19:21

Detectar capacidad total de varios módulos de memoria
 
Hola de nuevo:

Estoy intentando averigar la memoria total de un ordenador. He encontado este código en la web de SwissDelphiCenter:

http://www.swissdelphicenter.ch/en/showcode.php?id=94

Sin embargo, cuando el ordenador dispone de más de un módulo de memoria, únicamente obtengo la memoria total de un único módulo. ¿Alguna solución?

Casimiro Notevi 02-08-2012 14:23:37

Por favor, recuerda poner títulos descriptivos a lo que se pregunta, gracias :)

Jose_Pérez 02-08-2012 14:44:47

Cita:

Empezado por Casimiro Notevi (Mensaje 438688)
Por favor, recuerda poner títulos descriptivos a lo que se pregunta, gracias :)

Tienes razón. Hecho. :D

Neftali [Germán.Estévez] 02-08-2012 15:35:25

Si buscas en los foros sobre WMI verás que hay bastantes mensajes al respecto. También puedes encontrar aplicaciones de ejemplo.
En este caso la clase que creo que te interesa es WIN32_PhysicalMemory.
Con ella puedes obtener los bancos de memoria y la cantidad en cada uno de ellos.

Jose_Pérez 17-08-2012 15:26:47

Hola Naftali:

Estoy trabajando con Delphi 5 y Windows XP. Estoy intentando importar la libería de WMI, pero no me aparece el objeto Microsoft DTSPackage Object Library (Versión X.X). ¿Cómo puedo hacerlo?

Neftali [Germán.Estévez] 17-08-2012 16:25:52

Si estás con WMI en todo caso la que tendrás que importar será la librería: “Microsoft WMI Scripting V1.2 Library” (o similar).
:confused::confused:

Jose_Pérez 20-08-2012 14:40:41

Cita:

Empezado por Neftali (Mensaje 439825)
Si estás con WMI en todo caso la que tendrás que importar será la librería: “Microsoft WMI Scripting V1.2 Library” (o similar).
:confused::confused:

Hmmm... pareces sorprendido por mi pregunta.

Como bien dices, la librería es “Microsoft WMI Scripting V1.2 Library". Yo únicamente seguí el artículo de tu web al pie de la letra

http://neftali.clubdelphi.com/?p=185

...que enlaza por error desde...

Para acceder desde Delphi a WMI lo primero que necesitamos en Importar la librería desde el menú de Project/Import Type Library (pasos aquí): en http://neftali.clubdelphi.com/?p=523

... de ahí el lío. :D

Neftali [Germán.Estévez] 20-08-2012 15:20:29

Bueno, no enlaza por error, lo que sí es verdad es que a lo mejor la explicación no es clara:

En este artículo se explica cómo importar una librería. Sirve para cualquier librería, sólo que cambiando la librería a importar. Lo realmente importante son los pasos a realizar.

Lo que intentaba decir en este segundo artículo era, que se importara la librería “Microsoft WMI Scripting v1.X Library (Version 1.X)“, siguiendo las pasos que se describían en el artículo. Pero cambiando el nombre de la librería (tal vez eso es lo que no aclaré bien)... :o

Jose_Pérez 20-08-2012 16:22:31

En cualquier caso, siempre es un placer encontrar en internet a gente como tú que dedica su tiempo en transmitir sus conocimientos a los demás. Gracias!!!

escafandra 21-08-2012 19:49:45

¿Has tratado de probar de esta forma?

Código Delphi [-]
PERFORMANCE_INFORMATION = record
  cb: DWORD;
  CommitTotal: DWORD;
  CommitLimit: DWORD;
  CommitPeak: DWORD;
  PhysicalTotal: DWORD;
  PhysicalAvailable: DWORD;
  SystemCache: DWORD;
  KernelTotal: DWORD;
  KernelPaged: DWORD;
  KernelNonpaged: DWORD;
  PageSize: DWORD;
  HandleCount: DWORD;
  ProcessCount: DWORD;
  ThreadCount: DWORD;
end;
PPERFORMANCE_INFORMATION = ^PERFORMANCE_INFORMATION;

function GetPerformanceInfo(pPI: PPERFORMANCE_INFORMATION; cb: DWORD): boolean; stdcall; external 'psapi.dll';

//............................

var
 PI: PERFORMANCE_INFORMATION;
begin
 GetPerformanceInfo(@PI, sizeof(PI));
 ShowMessage('Memoria total: ' + IntToStr(PI.PhysicalTotal * PI.PageSize) + ' Bytes');
end;

(Probado en WinXP Sp3, Delphi7 y PC con dos módulos de memoria RAM).


Saludos.

Jose_Pérez 23-08-2012 10:51:12

Cita:

Empezado por escafandra (Mensaje 440231)
Código Delphi [-]
function GetPerformanceInfo(pPI: PPERFORMANCE_INFORMATION; cb: DWORD): boolean; stdcall; external 'psapi.dll';

La idea es crear una aplicación que realice un inventario de todos los equipos en red. Veo que esta función "tira" de una DLL. Mi duda es, ¿una vez compilado el ejecutable, es necesario que exista esta DLL en los equipos de la red para que funcione?

escafandra 23-08-2012 13:04:17

Cita:

Empezado por Jose_Pérez (Mensaje 440438)
La idea es crear una aplicación que realice un inventario de todos los equipos en red. Veo que esta función "tira" de una DLL. Mi duda es, ¿una vez compilado el ejecutable, es necesario que exista esta DLL en los equipos de la red para que funcione?

Esa DLL (psapi.dll) forma parte del S.O. (Windows) por lo tanto todos los equipos la tienen. En delphi 7 debes importarla (como muestro) para que compile, en versiones posteriores probablemente no.

Claro que con el ejemplo cada equipo local sabrá su memoria pero tendrás que establecer un sistema para que se informe al servidor, puesto que dices que la idea es un sistema en red...

Como al inicio del tema comentabas un ejemplo para equipo local, que no te funcionaba en todos los PCs probados, escribí mi ejemplo para solucionar tu problema. A mi me funciona, pero pruébalo con tus condiciones y dime si el resultado es satisfactorio. :)


Saludos.

Jose_Pérez 23-08-2012 13:19:17

Cita:

Empezado por escafandra (Mensaje 440445)
Claro que con el ejemplo cada equipo local sabrá su memoria pero tendrás que establecer un sistema para que se informe al servidor, puesto que dices que la idea es un sistema en red...

La idea es hacerlo mediante Sockets. Nunca lo he hecho. Llevo 25 años programando (no siempre en Delphi, claro ;) ) y la verdad es que siempre hay algo nuevo por hacer y por aprender. Llegado el momento, si tengo alguna duda, ya abriré un nuevo hilo en el foro.

Pero primero quiero terminar con el desarrollo de la captura de configuración del equipo.

Cuando pruebe tu código en un equipo con dos módulos de memoria te digo algo.

Jose_Pérez 23-08-2012 16:20:14

Cita:

Empezado por Neftali (Mensaje 439825)
Si estás con WMI en todo caso la que tendrás que importar será la librería: “Microsoft WMI Scripting V1.2 Library” (o similar).
:confused::confused:

Para los no iniciados en WMI, como es mi caso, he encontrado una función muy buena que permite leer las propiedades de las clases con WMI.

http://delphi.xcjc.net/viewthread.php?tid=46207

En mi caso, como ya dije, trabajo con Delphi 5. Una vez importada la libreria que nos indicaba Neftali, he añadido ActiveX y WbemScripting_TLB a las uses.

Saludos.

Neftali [Germán.Estévez] 23-08-2012 17:53:31

Básicamente así es como se usa WMI; Ya ves que una vez importada la libería con un código como ese ya puedes consultar lo que necesitas.
El el FTP del club, hay varios ejemplos sobre WMI, y si te fijas en el código, es bastante similar a ese.

Jose_Pérez 27-08-2012 11:08:40

Ahora se me plantea otra duda.

Partiendo de la función a la que hacía referencia...

http://delphi.xcjc.net/viewthread.php?tid=46207

...por ejemplo, ¿cómo puedo acceder a la propiedad caption de la clase Win32_Printer de todos los elementos para listar todas las impresoras instaladas?

Jose_Pérez 27-08-2012 13:36:03

No me habá dado cuenta. Funciona bien tal cual está... :rolleyes:

Código Delphi [-]
While (Enum.Next(1,TempObj,Value)=S_OK) Do
        begin
     
        // Recorre todos los elementos.

        end;

Únicamete habría que cambiar la fuinción para que delvolviera una lista en lugar de un String. ;)


La franja horaria es GMT +2. Ahora son las 04:13:21.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi