以下方法还是通过汇编实现,不过针对x64做了调整,以支持x86和x64两种环境,最后注释里是使用示例,在d10.1up2中测试通过,代码如下:
// 获取cpu序列号
type
TCPUID = array [1 .. 4] of Longint;
function GetCPUID: TCPUID;
asm
{$IF Defined(CPUX86)}
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
{$ELSEIF Defined(CPUX64)}
PUSH RBX
PUSH RDI
MOV RDI,RCX
MOV EAX,1
CPUID
mov [rdi], eax;
mov [rdi+4], ebx;
mov [rdi+8], ecx;
mov [rdi+12], edx;
POP RDI
POP RBX
{$IFEND}
(* 调用示例
var id: TCPUID;
id := GetCPUID;
ShowMessage(IntToHex(id[4], 8) + IntToHex(id[1], 8));
*)
end;