Delphi下获取CPU相关信息,如CPU名字以及厂商等.
用什么函数,怎么实现?
用什么函数,怎么实现?
解决方案 »
- 请教两个多线程的问题
- COM+,大家都来讨论下,以解开迷团
- 请问 我这句数据库更新语句哪里有问题 谢谢!!
- 怎样在Dephi中打开存储在ACCESS中数据类型为OLE的数据.
- OleInitialize 要 引用什么文件?
- BDE VS ADO
- 如何做到程序自动给WebBrowser控件中的网页具有焦点的文本框填上文字?
- 请问如何使用递归,TKS!在线等…
- 各位DELPHI高手们,我想知道DELPHI开发数据库有没有优势。
- 关于用NMSTP发送外部邮件的问题,各位大哥帮忙啊,分数一定奉送的!
- 跪求,已知一任意椭圆的圆心坐标和长短轴距离,如何绘制该旋转椭圆?
- ***小弟想开发个rs485 的IC卡程序****
CPUVendorIDs :array[0..5] of string = ('GenuineIntel','UMC UMC UMC','AuthenticAMD','CyrixInstead','NexGenDriven','CentaurHauls');
//将CPU厂家信息转换成字串形式
CPUVendors :array[0..5] of string = ('Intel','UMC','AMD','Cyrix','NexGen','CentaurHauls');type TVendor = array [0..11] of char;// 获取CPU厂家信息,返回值为TVendor类型
function GetCPUVendor : TVendor; assembler; register;
asm
PUSH EBX
PUSH EDI
MOV EDI,EAX
MOV EAX,0
DW $A20F //CPUID指令
MOV EAX,EBX
XCHG EBX,ECX
MOV ECX,4
@1:
STOSB
SHR EAX,8
LOOP @1
MOV EAX,EDX
MOV ECX,4
@2:
STOSB
SHR EAX,8
LOOP @2
MOV EAX,EBX
MOV ECX,4
@3:
STOSB
SHR EAX,8
LOOP @3
POP EDI
POP EBX
end;
调用方式:
var
Vendor: string;
VendorID, I: integer;
begin
Vendor := GetCPUVendor;
for i := 0 to High(CPUVendorIDs) do
begin
If Vendor = CPUVendorIDs[I] then
begin
Vendor := CPUVendors[I]; //把厂家信息精简一下,好看多了
VendorID := i;
break;
end;
end;
end;
二、获取CPU类型信息
const ID_BIT=$200000; //CPU ID 位标记
type TCPUID=array[1..4] of Longint;//判断CPUID信息是否有效
function IsCPUIDAvailable : Boolean; register;
asm
PUSHFD //不允许直接存取,必须通过堆栈
POP EAX
MOV EDX,EAX
XOR EAX,ID_BIT
PUSH EAX
POPFD
PUSHFD
POP EAX
XOR EAX,EDX //检测ID位是否受影响
JZ @exit //CPUID无效
MOV AL,True //CPUID无效
@exit:
end;//获取CPUID信息,返回值为TCPUID类型
function GetCPUID : TCPUID; assembler; register;
asm
PUSH EBX
PUSH EDI
MOV EDI,EAX
MOV EAX,1
DW $A20F //CPUID指令
STOSD //CPUID[1]
MOV EAX,EBX
STOSD //CPUID[2]
MOV EAX,ECX
STOSD //CPUID[3]
MOV EAX,EDX
STOSD //CPUID[4]
POP EDI
POP EBX
end;
具体使用方法:
const
CPUSubModels: array[0..4] of string = ('Primary','OverDrive','Secondary','Reserved','Not Detected');
var
CPUID: TCPUID;
SubModel: string;
SubModelID, Family, Model, Stepping: Integer;
begin
//如果CPUID信息有效
if IsCPUIDAvailable then
begin
fillchar(CPUID, sizeof(CPUID), -1);
CPUID := GetCPUID;
SubModelID := CPUID[1] shr 12 and 3;
Family := CPUID[1] shr 8 and $F;
Model := CPUID[1] shr 4 and $F;
Stepping:= CPUID[1] and $F;
if SubModelID < 4 then
SubModel := CPUSubModels[SubModelID]
else
SubModel := CPUSubModels[4];
end;
end;
完整的UNIT