Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Sobre los Componentes de MITEC para obtener Datos del Hardware (https://www.clubdelphi.com/foros/showthread.php?t=64251)

JoAnCa 24-03-2009 16:55:01

Sobre los Componentes de MITEC para obtener Datos del Hardware
 
Hola a todos, y sigo aqui preguntando

Hace algun tiempo, Neftali me recomendo usar estos componentes para obtener los datos del hardware, con los cuales hice mi programa.
Todo funciono bien hasta que adquiri una nueva PC, Core 2 Duo a 3.0 GHz, y para mi sorpresa el componente de MITEC (y su ultima version MiTeC System Information X 1.0.0) me detectan mi PC como un Pentium III :confused:
Y en el caso de mi Soft, no me pone nada en la RAM :(

Al parecer, ese componente no me va a servir, pues cada vez hay mas Core Duo, Dual Core, etc., y ya el mismo no me da la informacion correcta

Mi pregunta es: Hay algun otro componente similar mas actualizado?
O de que forma puedo obtener los datos del Microprocesador y de la Memoria RAM: Tipo (SDRAM, DDR o DDR2) y capacidad

cHackAll 27-03-2009 02:12:27

Considerando solo el caso, entre c2d, c2d movil, c2q, c2q movil, Extreme, Xeon, modelo 17h contra los Pentium III-; debemos reconocer que el Model Number de los Intel Core 2 TM … es el máximo posible (15 ~1111b).

Es difícil que un programa pueda reconocer a los futuros microprocesadores, mucho más si consideramos que entre las dos empresas lideres actualmente sobrepasamos las 200 firmas de microprocesadores. Ahora imaginemos con el resto; (Intel, AMD), Centaur, Cyrix, Transmeta, National Semiconductor, NexGen, Rise, SiS, UMC, VIA,… :rolleyes:

Para poder obtener dicha firma se debe utilizar la instrucción CPUID que obtiene información directamente del microprocesador. Entre las funciones que soporta dicha instrucción tenemos un grupo "extendido" que debería simplificarnos el problema expuesto;

Cita:

Empezado por Intel
Functions 8000_0002h, 8000_0003h, and 8000_0004h each return up to 16 ASCII bytes of the processor name in the EAX, EBX, ECX, and EDX registers. The processor name is constructed by concatenating each 16-byte ASCII string returned by the three functions. The processor name is right justified with leading space characters. It is returned in little-endian format and NULL terminated. The processor name can be a maximum of 48 bytes including the NULL terminator character. In addition to the processor name, these functions return the maximum supported speed of the processor in ASCII.

Codifiquemos;

Código Delphi [-]
function ProcessorName: PChar;
const Buffer: array [0..47] of Char = '';
asm
 push  esi
 push  edi
 mov   esi, 80000001h
 lea   edi, Buffer
 push  ebx
 push  edi
@next: inc  esi
 mov   eax, esi
 cmp   al, 5
 je   @done
 cpuid
 stosd
 xchg  eax, ebx
 stosd
 xchg  eax, ecx
 stosd
 xchg  eax, edx
 stosd
 jmp  @next
@done:
 pop   eax
 pop   ebx
 pop   edi
 pop   esi
end; // by cHackAll

procedure TForm1.Button1Click(Sender: TObject);
begin
 Label1.Caption := ProcessorName;
end;

Con seguridad, el anterior código será suficiente porque ha sido creado con "ese" objetivo. Aunque también podemos obtener la misma información desde el registro del SO;

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
 hKey: Windows.HKEY;
 ProcessorNameString: array [0..47] of Char;
 cbData: Cardinal;
begin
 cbData := SizeOf(ProcessorNameString);
 RegOpenKey(HKEY_LOCAL_MACHINE, 'HARDWARE\DESCRIPTION\System\CentralProcessor\0', hKey);
 RegQueryValueEx(hKey, 'ProcessorNameString', nil, nil, @ProcessorNameString, @cbData);
 RegCloseKey(hKey);
 ProcessorNameString[cbData] := #0;
 Label1.Caption := ProcessorNameString;
end;

Es más complicado obtener las capacidades de los módulos DIMM (u otros) instalados en el ordenador, pero podemos apoyarnos en una API para obtener la cantidad de memoria física (por ahora hasta aqui llego :o);

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var MemoryStatus: TMemoryStatus;
begin
 MemoryStatus.dwLength := SizeOf(MemoryStatus);
 GlobalMemoryStatus(MemoryStatus);
 Label1.Caption := IntToStr(MemoryStatus.dwTotalPhys div (1024 * 1024)) + ' Mb.';
end;

Saludos


La franja horaria es GMT +2. Ahora son las 14:10:12.

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