Librería de componentes GLibWMI 3.2
GLibWMI es una librería/biblioteca de componentes enfocados a la Administración de Sistemas Windows.
Están basados en la WMI de Windows (Windows Management Instrumentation). Podéis conocer algo más sobre WMI en la entrada del blog titulada «WMI – Introducción«.
ACTUALIZACIÓN 01/02/2024.
Actualmente se ha liberado la versión 3.2 estable (compatible con Delphi 12 Athens).
El código se ha subido en GitHub y en el blog se mantienen las versiones antiguas.
NOTA IMPORTANTE: Debido a problemas con la autentificación de Github la ubicación antigua del proyecto queda obsoleta (https://github.com/NeftaliDelphi/GLibWMI), las nuevas actualizaciones se harán en este repositorio:
https://github.com/germanestevez/GLibWMI
Proyecto en GitHub.
_________________________________________________________
ACTUALIZACIÓN 16/09/2021.
Actualizada la librería de componentes para que funcione con la versión 11 de delphi.
_________________________________________________________
ACTUALIZACIÓN 01/07/2020.
La librería de componentes se ha actualizado a la versión 3.0 considerada como estable (hasta ahoira estaba en fase beta). Se han añadido además nuevas demos y se han actualizado las existentes.
La versión 3.0 cuenta con nuevos componentes y compila sin problemas desde Delphi 6 hasta la versión Delphi 10.3 (por ahora no se ha probado en 10.4, pero debería compilar sin ningun problema).
ACTUALIZACIÓN 03/04/2019.
Actualizada la librería la versión 2.2b. Compatible con Delphi 10.2 (Tokyo) y anteriores.
- Eliminados Hints y Warnings en los de componentes.
- Eliminados Hints y Warning en los ejemplos .
- Se añaden Units a los uses necesarias para versiones nuevas.
- Se añade fichero incluyendo directivas de compilación.
- Se generan packages para las nuevas versiones de delphi.
<DESCARGAR LIBRERÍA COMPLETA versión 2.2b>
<DESCARGAR SOURCE DEMOS versión 2.2b>
<DESCARGAR EXE DEMOS versión 2.2b>
_________________________________________________________
ACTUALIZACIÓN: 1o/09/2014.
Liberada la Versión 2.1b.
Nuevas propiedades en los componentes y algunos errores corregidos.
Además la librería se ha compilado con Delphi XE7 sin problemas.
<DESCARGAR LIBRERÍA COMPLETA versión 2.1b>
<DESCARGAR SOURCE DEMOS versión 2.1b>
<DESCARGAR EXE DEMOS versión 2.1b>
_________________________________________________________
ACTUALIZACIÓN: 01/08/2013.
Liberada la Versión 2.0b.
Nuevos componentes añadidos (BootConfigurationInfo, DesktopInfo CodecsInfo, RegistryInfo, TimeZoneInfo) y corrección de algunos bugs.
Compilado para las nuevas versiones de Delphi, incluídas XE4 y XE5.
<DESCARGAR LIBRERÍA COMPLETA versión 2.0b>
<DESCARGAR SOURCE DEMOS versión 2.0b>
<DESCARGAR EXE DEMOS versión 2.0b>
_________________________________________________________
ACTUALIZACIÓN: 23/02/2010.
Liberada la Versión 1.8b.
Nuevos componentes añadidos y corrección de algunos bugs; Correción en la recuperación de propiedades y algunas pérdidas de memoria.
Actualizadas las demos con los nuevos componentes.
Como la anterior verión, los últimos cambios están subidos en Sourceforge (GLibWMI).
<Descargar librería completa; Sources+Bin versión 1.8b>
<Descargar demos; Sources+Bin versión 1.8b>
<Descargar demos; Bin versión 1.8b>
_________________________________________________________
ACTUALIZACIÓN: 22/01/2010.
Versión 1.6b.
He subido el proyecto a Sourceforge (GLibWMI). La ultima versión estará disponible allí para su descarga.
Se distribuye con licencia GNU y todos los ficheros (incluídos los fuentes se pueden descargar).
Descargar ficheros:
<GLibWMI completa 1.6b>
<GLibWMI demos 1.6b>
<GLibWMI EXE demos 1.6b>
_________________________________________________________
La librería está en fase beta y se puede usar de forma libre y gratuíta.
Las versiones actuales están disponibles (ficheros compilados) para D6, D7 y D2009.
Se pueden descargar diferentes paquetes:
<GLibWMI>
<GLibWMI para Delphi 6>
<GLibWMI para Delphi 7>
<GLibWMI para Delphi 2009>
<Demos compiladas>>
Funciona sin problemas en sistemas basados en Windows 2000 y posteriores.
Para más información consultar:
«Operating System Availability of WMI Components»
Como bien he dicho, están en fase beta, así que se aditen sugerencias, errores, comentarios,…
Un saludo.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
When runnning the general demo (the compiled executable) on W7 Ultimate x64 I get an AV when try to see ProcessorInfo or OperatingSystemInfo information. Ulterior calls to those 2 categories work without problem.
Thank you for this release. The component pack looks great, pity there is no source code available. Because of that, to use this components in a application is a hard to make decision.
Again thank you
Hello Alin.
Thanks for your comments.
I tried the demo on Windows 7 and I got the same error AV. The first time occurs the error, the following is working properly.
I will look if it is due to component or to the demo.
For now, the package is in beta version. Finally it will be distributed for free to be used freely.
I’m still spending if the code is also freely distributed.
Regards.
Excuse for my bad english.
Hola, que tal, que maravilla de componentes, si los hubiese visto antes no que ya me arranque los pelos con la pura WMI jeje, bueno te comento que trabajando con el componente TDiskDriverInfo si me otorga la información que debe de ser pero cada vez que se ejecuta, es decir, se activa la aplicación aumenta la cantidad de memoria utilizada (en el administrador de tareas) entonces con agregar un _Release a la variable SObject en el UProcedure.pas y en el siguiente procedimiento al final del bucle while, se sigue ejecutando pero sin aumentar la cantidad de la memoria utilizada, saludos
procedure GetWMIProperties(AIndex:integer; {0-TODOS 1-Primero 2-segundo 3…}
Services:ISWbemServices; wmiClass:string;
var aProperties:TStrings);
var
SObject: ISWbemObject;
ObjSet: ISWbemObjectSet;
Enum: IEnumVariant;
TempObj: OleVariant;
Value: Cardinal;
i: integer;
begin
// proteccion a problemas
try
// realizar la consulta
ObjSet := Services.ExecQuery(‘SELECT * FROM ‘+wmiClass, ‘WQL’,
wbemFlagReturnImmediately and wbemFlagForwardOnly , nil);
// Lista de objetos
Enum := (ObjSet._NewEnum) as IEnumVariant;
if (AIndex 0) then begin
i := 1;
// Recorrer la lista
while (i AIndex) do begin
Enum.Next(1, TempObj, Value);
inc(i);
end;
end;
// Recorrer la lista
while Enum.Next(1, TempObj, Value) = S_OK do begin
// Access al objeto
try
SObject := IUnknown(TempObj) as ISWBemObject;
except
SObject := nil;
end;
// Encontrado?
if (SObject nil) then begin
// Acceder a la propiedad
SObject.Properties_;
aProperties.Add(SObject.GetObjectText_(0));
end;
if (AIndex 0) then begin
Exit;
end;
SObject._Release; <—–agregando esta linea ya no se acumula la-
end; cantidad de memoria utilizada por la app.
finally
// Nada (pendiente)
end;
end;
@DrKiroCorp
Hola DrKiroCorp.
Gracias por el comentario, lo tendré en cuenta para esta próxima release.
La verdad es que tengo pendiente revisar tódo el código con algun profiler para detectar este tipo de fallos.
Gracias de nuevo.
Un saludo.
Hola Neftali.
Instale tu componente 1.8b en D2009, pero al ejecutar las demos, no encuentra el CWMIBase.dcu
Que me falta,
Gracias
Hola Victor.
Pues es raro, porque debería compilar perfectamente. De todas formas esa unit está incluida en los fuentes, así que lo que debes hacer es añadir el directorio donde se encuentra al path de búsqueda.
Entra en las opciones del proyecto y en los directorios de búsqueda de los Sources añade ese.
UProcedures
286-> if (index 0) then begin
if (index = 1) then begin
@yyimen
Hola yyimen.
¿Puedes explicar un poco mejor esto que me comentas?
Can you explain better this change, please?
Gracias/thanks.
hola neftali uso tu paquete GLibWMI pero quiero saber si puedes agragarle un componente para el control de las RPM de los fan tanto del cpu como los de case
@Kurono
Hola Kurono.
Puedo generar el componente, pero me tendrías que echar una mano para hacer unas pruebas.
He hecho un pequeño proyecto de ejemplo para probar la clase Win32_Fun (http://msdn.microsoft.com/en-us/library/aa394146%28VS.85%29.aspx) que es la que debería devolver la información de ventiladores, pero en mi caso (mi ordenador) no obtengo nada. Supongo que esto depende directamente de la placa y la onformación que esta ofrezca a la WMI.
El problema es que no se si es problema del componente o de mi ordenador. ¿Podrías probar el ejemplo que te comento?
Se trata de un proyecto Delphi, comprimido que hay aquí:
http://neftali.clubdelphi.com/files/PtestVentiladores.rar
En mi caso obtengo esta imagen al arrancar el proyecto:
http://neftali.clubdelphi.com/files/Imagen360.png
Significa que la clase Win32_Fan no ha devuelto ningun elemento. ¿Puedes probar a ver si obtienes algo de información?
Un saludo.
hola neftali probe la aplicacion en una latop dell c610 y me devolvio resultados lo puedes ver aqui
http://www.subirimagenes.net/show-image.php?id=c7ee6304edba1a3f087dee2a2c31754e
hola neftali quisiera saber que has hecho con el componente de control de los Ventiladores que te habia solicitado no se si has tenido la oportunidad de ver la imagen que te envie en mi ultimo comentario
Hola Kurono.
He visto la imagen, pero como ves no da imformación de la velocidad de giro de los ventiladores (RPM). De ahí que no te comentara nada más.
Un saludo.
entonces no hay forma de crear la libreria para controlar las rpm
@Kurono
Hola Kurono.
Parece que con las clases básicas de WMI no es posible. Por otra parte, la forma de acceso a los sensores de cada placa es diferente, de ahí que tenga sentido que no exista un método genérico de acceder.
Eso no quiere decir que definitivamente no se pueda.
Hay varias opciones.
* La primera (siguiendo con WMI): Es habitual y posible que distintos componentes del ordenador o programas de software (sus proveedores) puedan añadir clases WMI para consultar las propiedades de sus productos. Podrías leer la documentación de tu placa para ver si esto es así.
* La segunda es sin utilizar WMI; Revisar la web del fabricante de la placa a ver si pone a disposición para descarga algun ActiveX, DLL o similar para poder acceder a esa información.
Siento no poder ayudarte más, pero GLibWMI es una librería que accede a las propiedades de WMI. Si WMI no publica la información, GLibWMI no puede consultarla.
Un saludo.
ok gracia neftali investigare si existe alguna dll o algo parecido sobre mi placa base
Hola neftalí, el día de hoy estuve buscando como obtener la información del disco duro hasta que he llegado a tu web. de verdad muy buenos el set de componentes. haz hecho un estupendo trabajo.
Al compilar el programa con el DiskDriveInfo sobre Win7 con Delphi 2010 todo marchó muy bien.
Luego llevé este ejecutable a una maquina virtual (Oracle VM VirtualBox corriendo WinXP) y no corria el aplicativo. haciendo un debug remoto del programa obtuve el siguiente error:
EDOMParseError «El documento XML debe tener un elemento de nivel superior»
@movorack
El error que comenté anteriormente sucedia por un error en el archivo (XML) de configuración de mi programa.
aunque al correr el programa, y llamar la función (debe ser por estar en una maquina virtual) no me devuelve información del disco duro.
@movorack
Hola movorack.
Los datos que devuelven los componentes, son los que Windows obtiene del sistema vía WMI. Los diferentes sistemas implementan diferentes propiedades, así que es normal, por ejemplo, que en Vista obtengas más información que en XP, o que en W7 obtengas más que en Vista y XP. En general, a cada versión más nueva del S.O. las propiedades de cada clase se amplían.
Me extraña lo de la máquina virtual, porqu yo mismo las utiliza muy a menudo para pruebas y en concreto para probar los componentes en diferenes versiones de Windows.
En mi caso utilizao también VirtualBox y a mí sí me devuelve info.
Aquí puedes ver una imagen: http://tinyurl.com/36lf2f3
Lo que puede pasar es que en algunas versiones, como te he dicho haya propiedades que no se rellenan. En el caso del SerialNumber, por ejemplo, si miras la definición de la clase: http://tinyurl.com/c2ap3b
verás que esa propiedad sólo está disponible a partir de Vista.
Esto puede pasar con otras y debe estar explicado en la definición de cada clase.
Un saludo.
Hola German
Probé el componente y lo hice andar en XP perfectamente
y de hecho me hice varias rutinas de seguridad de mi sistema en base a
resultados obtenidos por tus componentes.
Pero… Reinstalé win (Win seven pro 32)
Primero me decia [DCC Fatal Error] main.pas(11): F1026 File not found: ‘CWMIBase.dcu’
Bueno agregué al path, luego me dice:
[MakeDir Error] Unable to create directory «c:\Archivos de programa\Borland\Delphi6\Tools\Developer Express Inc\dcus\». Access to the path ‘c:\Archivos de programa\Borland\Delphi6\Tools\Developer Express Inc\dcus\’ is denied.
Y no compila el componente. Yo Delphi6 jamás usé, así que asumo que
deben ser tus componentes, pero no encuentro donde o por qué busca
esa ruta. Asi que si tienes alguna solución rapida me la pasas pls,
yo de igual forma seguiré probando y leyendo a ver si alguien lo
solucionó o como hacer para corregir esto.
Muchisimas gracias. Tu trabajo está genial.
Un abrazo!
Walter
Hola Walter.
Estos problemas suelen ocurrir porque ha quedado alguna configuración guardada de cuando yo trabajaba con los componentes. En concreto el error de «Unable to create directory» es porque en el directorio de salida de los DCU’s se debe haber quedado puesto este:
“c:\Archivos de programa\Borland\Delphi6\Tools\Developer Express Inc\dcus\”
Entra en las opciones del DPK (package) y en los directorios de salida de DCU estará este. Basta con que lo elimines y deberías poder compilar sin problemas.
Ya me dirás si se ha solucionado.
Un saludo.
Nuevamente yo German, sorry pero no podia esperar mucho
creé manualmente la carpeta:
C:\Archivos de programa\Borland\Delphi6\Tools\Developer Express Inc\dcus\
Se que no deberia, pero nose porque crea esa carpeta al compilar y crea ahi todos los .dcu. Quizas en XP estaba pero no me di cuenta y en seven
no tiene permiso de creación y entonces Chan el Error!.
Bueno seguiré probando, pero creo que ya quedó. Cualquier cosa te comento.
Actualmente estoy usando DISKInf.DiskDriveProperties.Signature y CPUInf.ProcessorProperties.ProcessorID quisiera saber si se puede generar algo reducido con esto, ya que es un poco pesado todo en
ordenadores viejos.
Nuevamente muchisimas gracias por tu excelente material
Walter
Hola Walter.
Como te he dicho, puedes configurar esos directorios en las opciones del proyecto.
En cuanto a generar algo reducido como tú dices, estoy trabajando en un componente para lanzar sentencias SQl a WMI, con lo que se podrán pedir datos individuales (como los que necesitas). Espero que esté disponible en breve, pero por ahora hay que hacerlo como lo estás haciendo ahora.
Un saludo.
Primero de todo felicitarte por tu magnífico trabajo. Y segundo comentante un pequeño fallo que he detectado al usar el componente TProcessInfo.
El error se produce al intentar hacer un Terminate sobre un proceso por el ProcessID ya que por la forma de extraer las propiedades, el componente devuelve como ProcessID el ParentProcessID, con lo que la ejecución del Terminate no termina con exito.
Te dejo un fragmento de código de como lo he modificado yo:
Unidad: UProcedures.
procedure GetWMIPropertyValue
function _ExtractValue(Data:string):string;
var
str:string;
index, i:integer;
TS:TStrings;
begin
Result := »;
TS := TStringList.Create();
try
TS.Text := StrInfo;
// Recorrido por las propiedades
for i := 0 to (TS.Count – 1) do begin
// Cadena
Str := Trim(TS[i]);
index := AnsiPos(Data + ‘ = ‘, Str);
if (index = 1) then begin <—– esta linea era index0
@Montipyton
Hola «Montipyton».
Gracias por el comentario. me lo apunto. En breve espero sacar la nueva versión y añadiré este bug a los que ya tengo corregidos.
Un saludo.
TStartupCommandInfo sólo devolverá 32 entradas de lanzamiento poco y no ninguna de las entradas de la colmena de 64 bits. ¿Hay una bandera? ¿Puedo solicitar uno o el otro? o ambos?
http://support.microsoft.com/kb/305097
http://msdn.microsoft.com/en-us/library/aa393067 (v = vs.85). aspx
por cierto, un gran conjunto de componentes gracias
lo siento si esto no se traduce bien, yo no sé español (pero Google lo hace)
TStartupCommandInfo sólo devolverá 32 entradas de lanzamiento poco y no ninguna de las entradas de la colmena de 64 bits. ¿Hay una bandera? ¿Puedo solicitar uno o el otro? o ambos?
http://support.microsoft.com/kb/305097
http://msdn.microsoft.com/en-us/library/aa393067 (v = vs.85). aspx
por cierto, un gran conjunto de componentes gracias
lo siento si esto no se traduce bien, yo no sé español (pero Google lo hace)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
Wow6432Node las entradas no se devuelven
@Logman
Hello LogMan.
You can try search help about the properties «__ProviderArchitecture» and «__RequiredArchitecture». I think that with this properties you can configure the access to 32 or 64 architecture.
Regards.
Excelente trabajo. Esto en realidad a mi me sirve para estudiar el codigo. Con esto tengo para unas largas semanas de estudio. Muchas gracias por tu aporte.
Nada más que felicitarte…
Gracias por tu aporte.
Patricio Fica
Felicitaciones por este componente. Llegue a el buscando alguna aplicación en Delphi que me informara la temperatura del cpu,pero no la consigo en GLibWMI, realmente no la tiene o donde se encuentra? Gracias.
@Luis Fuentes
Hola Luis.
El tema de los sensores de Hardware es complicado, porque varía segun el Hardware de la máquina. Me explico. WMI tiene un gran númerode clases «base» que hay en todos los equipos. A partir de ahí, cada versión del sistema incluye clases nuevas, pero no sólo eso, sino que (como pasa por ejemplo en muchas clases de Hardware), puede ser que un determinado componente o la empresa que lo fabrica e instala el software en el sistema (Procesador, ventiladores, Placa base,…) cree nuevas clases WMI que se pueden utilizar.
Por eso es posible que las clases WMI de un equipo no sean las mismas de otro.
Busca documentación sobre WMI y sobre las clases de HardWare (GLibWMI implementa sólo unas cuantas) y tal vez encuentres otra clase que te permita obtener la temperatura. Si la encuentras, puedes revisar los ejemplos que acompañan la librería y verás que no es difícil obtener información del resto de clases.
O si te hace falta algun ejemplo más me lo pides y te puedo pasar varios sobre diferentes clases (diferentes de las incluídas en GLibWMI).
Un saludo.
problem when install GLibWMI 1.8
[IMG]http://img691.imageshack.us/img691/2121/picture0001m.png[/IMG]
@cargem
Hello cargem.
There are another package with a form (FormAbout) that have the same name (and registered).
(option 1) Uninstall the other package and test.
(option 2) Edit the form in GlibWMI library, change tha name and compile. For example, change the name for FormAboutGLibWMI.
If you compile and get some error about this, you only must update the old name FormAbout for the new name FormAboutGLibWMI.
Test it.
Regards.
Hola, estoy usando la versión 1.8 para recuperar la serie HD (DiskDriveInfo1.DiskDriveProperties.SerialNumber), pero cuando se ejecuta la aplicación en Windows XP devuelve una cadena vacía.
Ellos sabrían decir por qué ocurre esto, si no hay corrección?
¡Gracias!
@borato
Hola Elisenda.
La clase DiskDrive de WMI:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa394132(v=vs.85).aspx
sólo permite recuperar el serial para determinados sistemas operativos:
———————————————————————————————————-
SerialNumber
Data type: string
Access type: Read-only
Number allocated by the manufacturer to identify the physical media.
Example: WD-WM3493798728
Windows Server 2003, Windows XP, Windows 2000, and Windows NT 4.0: This property is not available.
———————————————————————————————————-
Si necesitas hacerlo para sistemas más antiguos puedes usar otros métodos, como el componentes TDiskInfo:
http://neftali.clubdelphi.com/?p=240
Si buscas en internet hay otras alternativas similares. Si combinas ambos puedes hacerlo para todos.
Un saludo.
¿Alguien ha probado estos componentes con Delphi XE3? ¡Saludos!
Seria otimo se ouvesse uma atualização no componente
@Eddie
@gleury
Hola.
No debería haber problemas para que los componentes pudieran compilar en las últimas versiones de Delphi.
Un saludo.
saludos Neftali
la funcion
ddProps.SerialNumber
no me devuelve nada o cadena vacia
@jonatan
Tal como explica la API (y en los comentarios anteriores), la función SerialNumber no funciona en todas las versiones de Windows.
¿Con qué versión estás trajando?
La probe en windows xp, no hay forma usar un componente que funciones en xp y en 7??
@jonatan
Revisa los comentarios anteriores; En concreto este:
http://neftali.clubdelphi.com/?p=589#comment-6508
Ahí están las versiones en las que funciona.
Hola me pueden ayudar porfavor estoy iniciandome en delphi y eh logrado hacer un sistema de logueo estoy estudiando actualmente y es para un trabajo para la escuela este sistema de logueo requiere de autenticar el ID del procesador este proyecto lo tiene pero no logro instalar los controles y mucho menos poder abrir los proyectos ya que me pide dichos controles quisiera porfavor si en un form me pueden separar el processor ID con su label y textbox muchas muchas gracias!!
@Andres Salazer
Hola Andrés.
Una vez descargada la versión completa del paquete de componentes (que incluye los fuentes), descomprímelo en un directorio y abre el fichero de proyecto (DPK o DPROJ, dependiendo de la versión de delphi).
Compila e instala los componentes. Si te da algun error de que no encuentra fuentes, deberás añadir los directorios de fuentes al path de búsqueda (opciones de proyecto).
Un saludo.
to work in Delphi XE changed the conditional compiler
«CompilerVersion> = 16.0» to «CompilerVersion> = 23.0»
right?
@Luis
Thanks for this puntualization Luis.
Hola Neftalí, saludos y felicitaciones por tus componentes, son excelentes!!. Tengo un problema o duda, estoy haciendo una aplicación de o cual crea un número serial para validar el programa por primera vez, estoy usando los componentes GLibWMI para realizarlo, en especifico los de BiosCode, pero al correrlo y validarlo con este ejemplo:
BiosCode:=BiosInfo1.GetHashCode;
if Hash 0 then
EdIcode.Text := inttostr(Bioscode)+Claveanhadida
else
EdIcode.Text := inttostr(Bioscode);
Clave := EdIcode.Text;
El valor que puse en EdIcode varía, sé que si corro la aplicación en modo administrador el valor guardado en esta variable permanece fijo, cómo haría para que el valor permanezca fijo, cualquier ayuda sería excelente, uso Win 8.1. De antemano, muchísimas gracias.