请高手帮我看一下啊!library GetCpuId;uses
SysUtils,
Classes,
ShareMem;{$R *.res}
const
ID_BIT = $200000; // EFLAGS ID bit
type
TCPUID = array[1..4] of Longint;
TVendor = array [0..11] of char;
function GetId :PString; register;
var
CPUID : TCPUID;
I : Integer;
S : TVendor;
PCpuId : PString;
str : String;
function IsCPUID_Available : Boolean; register;
asm
PUSHFD {direct access to flags no possible, only via stack}
POP EAX {flags to EAX}
MOV EDX,EAX {save current flags}
XOR EAX,ID_BIT {not ID bit}
PUSH EAX {onto stack}
POPFD {from stack to flags, with not ID bit}
PUSHFD {back to stack}
POP EAX {get back to EAX}
XOR EAX,EDX {check if ID bit affected}
JZ @exit {no, CPUID not availavle}
MOV AL,True {Result=True}
@exit:
end;function GetCPU : TCPUID; assembler; register;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Resukt}
MOV EAX,1
DW $A20F {CPUID Command}
STOSD {CPUID[1]}
MOV EAX,EBX
STOSD {CPUID[2]}
MOV EAX,ECX
STOSD {CPUID[3]}
MOV EAX,EDX
STOSD {CPUID[4]}
POP EDI {Restore registers}
POP EBX
end;function GetCPUVendor : TVendor; assembler; register;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Result (TVendor)}
MOV EAX,0
DW $A20F {CPUID Command}
MOV EAX,EBX
XCHG EBX,ECX {save ECX result}
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 {Restore registers}
POP EBX
end;begin
new(PCpuId);
for I:=Low(CPUID) to High(CPUID) do CPUID[I] :=-1; if IsCPUID_Available then
begin
CPUID :=GetCPU;
S :=GetCPUVendor;
str:=IntToStr(CPUID[1] shr 8 and $f)+IntToStr(CPUID[1] shr 4 and $f)+IntToStr(CPUID[1] shr 12 and 3)+IntToStr(CPUID[1] and $f)+IntToHex(CPUID[1],8)+S;
//AssignStr(PCpuId, str);
PCpuid^:=str;
result:=PCpuId;
dispose(PCpuId);
end
else
begin
str:='ghfdegchehndjhdfhhpo';
//AssignStr(PCpuId, str);
PCpuid^:=str;
result:=PCpuId;
dispose(PCpuId);
end;
end;exports
//注意大小写
GetID;
begin
end.
/////////////////////////////////////////////////////////////////////////
调用:
var
Form1: TForm1;
function GetId:PString; external 'GetCpuId.dll';
implementation{$R *.dfm}procedure TForm1.SpeedButton1Click(Sender: TObject);
var
P :PString;
begin
new(p) ;
p:=getid ;
edit1.Text:=p^;
dispose(p) ;
end;
SysUtils,
Classes,
ShareMem;{$R *.res}
const
ID_BIT = $200000; // EFLAGS ID bit
type
TCPUID = array[1..4] of Longint;
TVendor = array [0..11] of char;
function GetId :PString; register;
var
CPUID : TCPUID;
I : Integer;
S : TVendor;
PCpuId : PString;
str : String;
function IsCPUID_Available : Boolean; register;
asm
PUSHFD {direct access to flags no possible, only via stack}
POP EAX {flags to EAX}
MOV EDX,EAX {save current flags}
XOR EAX,ID_BIT {not ID bit}
PUSH EAX {onto stack}
POPFD {from stack to flags, with not ID bit}
PUSHFD {back to stack}
POP EAX {get back to EAX}
XOR EAX,EDX {check if ID bit affected}
JZ @exit {no, CPUID not availavle}
MOV AL,True {Result=True}
@exit:
end;function GetCPU : TCPUID; assembler; register;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Resukt}
MOV EAX,1
DW $A20F {CPUID Command}
STOSD {CPUID[1]}
MOV EAX,EBX
STOSD {CPUID[2]}
MOV EAX,ECX
STOSD {CPUID[3]}
MOV EAX,EDX
STOSD {CPUID[4]}
POP EDI {Restore registers}
POP EBX
end;function GetCPUVendor : TVendor; assembler; register;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Result (TVendor)}
MOV EAX,0
DW $A20F {CPUID Command}
MOV EAX,EBX
XCHG EBX,ECX {save ECX result}
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 {Restore registers}
POP EBX
end;begin
new(PCpuId);
for I:=Low(CPUID) to High(CPUID) do CPUID[I] :=-1; if IsCPUID_Available then
begin
CPUID :=GetCPU;
S :=GetCPUVendor;
str:=IntToStr(CPUID[1] shr 8 and $f)+IntToStr(CPUID[1] shr 4 and $f)+IntToStr(CPUID[1] shr 12 and 3)+IntToStr(CPUID[1] and $f)+IntToHex(CPUID[1],8)+S;
//AssignStr(PCpuId, str);
PCpuid^:=str;
result:=PCpuId;
dispose(PCpuId);
end
else
begin
str:='ghfdegchehndjhdfhhpo';
//AssignStr(PCpuId, str);
PCpuid^:=str;
result:=PCpuId;
dispose(PCpuId);
end;
end;exports
//注意大小写
GetID;
begin
end.
/////////////////////////////////////////////////////////////////////////
调用:
var
Form1: TForm1;
function GetId:PString; external 'GetCpuId.dll';
implementation{$R *.dfm}procedure TForm1.SpeedButton1Click(Sender: TObject);
var
P :PString;
begin
new(p) ;
p:=getid ;
edit1.Text:=p^;
dispose(p) ;
end;
var
Form1: TForm1; function GetId:PString; external 'GetCpuId.dll';register;最好改成
function GetId(id: Pchar): boolean;
這種方式