示例代码如下:
procedure TForm1Button1Click(Sender: TObject);type
TCPUID = array[14] of longint;
function GetCPUID: TCPUID;
asm
PUSH EBX
PUSH EDI
MOV EDI,EAX
MOV EAX,1
DW $A20F
STOSD
MOV EAX,EBX
STOSD
MOV EAX,ECX
STOSD
MOV EAX,EDX
STOSD
POP EDI
POP EBX
end;
var
aCpuId: TCpuID;
begin
aCpuId := GetCPUID;
ShowMessage('CPU 序列号是: ' + IntToHex(aCpuId[4],8) + IntToHex(aCpuId[1],8));
end;
代码运行截图:
与实际的对比:
获取CPU
序列号
要使用
汇编指令
比较麻烦
static
DWORD
g_eax;
//
存储返回的eax
static
DWORD
g_ebx;
//
存储返回的ebx
static
DWORD
g_ecx;
//
存储返回的ecx
static
DWORD
g_edx;
//
存储返回的edx
void
Executecpuid(DWORD
veax)
{
asm("cpuid"
:"=a"(g_eax),
"=b"(g_ebx),
"=c"(g_ecx),
"=d"(g_edx)
:"a"(g_eax));
}
int
isSupport;
void
GetSerialNumber(WORD
nibble[6])
{
Executecpuid(1);
//
执行cpuid,参数为
eax
=
1
isSupport
=
g_edx
&
(1<<18);
//
edx是否为1代表CPU是否存在序列号
if
(FALSE
==
isSupport)
//
不支持,返回false
{
return
;
}
Executecpuid(3);
//
执行cpuid,参数为
eax
=
3
memcpy(&nibble[4],
&g_eax,
4);
//
eax为最高位的两个WORD
memcpy(&nibble[0],
&g_ecx,
8);
//
ecx
和
edx为低位的4个WORD
STM32每一个芯片内部都有一个唯一的96位的ID号,可以通关过以下方式进行读取:
由于唯一ID是一个96位的数据,所以你要创建3个32位变量用于存储ID号
static u32 CpuID[3];
接着执行读取函:
void GetLockCode(void)
{
//获取CPU唯一ID
CpuID[0]=(vu32)(0x1ffff7e8);
CpuID[1]=(vu32)(0x1ffff7ec);
CpuID[2]=(vu32)(0x1ffff7f0);
}
数就可以了。
使用ManagementClass("Win32_Processor")获取cpuid失败,代码如下:
ManagementClass mc = new ManagementClass("Win32_Processor");
ManagementObjectCollection moc = mcGetInstances();
foreach (ManagementObject mo in moc)
{
_S_RegsionGUID = moProperties["ProcessorId"]ValueToString();
break;
}
当获取ProcessorId时失败,提示该值为Null,对于有些计算机成功对于有些计算机失败。 查看了一些ManagementClass 相关资料:[NET 框架中的WMI命名空间][WMI介绍及简单应用]解决办法如下:
1、判断出问题出在WMI上;
2、下载WMI管理工具WMIToolsexe,下载地址:>
以上就是关于如何用 DELPHI 获取 CPU 的序列号全部的内容,包括:如何用 DELPHI 获取 CPU 的序列号、VB6如何获取电脑的CPU序号、如何获得stm32 cpu的唯一ID等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)