Ja, die
GUID soll, oder besser muß sich ändern, es wird schließlich sekündlich 'ne Neue von Windows angefordert ... ist ein Testprogamm einer meiner Units (halt die mit den ganzen "System"-Funktionen)
OK, ich hab richtig gerechnet und du hattest eben nicht an den Registergrenzen getrennt *erleichtert bin*
So, dann hier mal die korregierte Funktion
in EBX ist meines Erachtens nur das 3. Byte definiert (CPUCount) und der Rest
kann variieren.
Delphi-Quellcode:
function GetID: string;
function IntToPos(Value: Integer): integer;
begin
if Value < 0 then
Result := -Value
else
Result := Value;
end;
var ID: TCPUID;
begin
if IsCPUID_Available then
begin
ID := GetCPUID;
result := IntToStr(IntToPos(ID[1])) + IntToStr(IntToPos((ID[2] shr 16) and $FF))
+ IntToStr(IntToPos(ID[3])) + IntToStr(IntToPos(ID[4]));
end
else
result := '0123456789'; //Dummywert
end;
[add]
Ach übrigens, statt IntToPos kann man auch Abs verwenden
Delphi-Quellcode:
Unit Math;
function GetID:
string;
var ID: TCPUID;
begin
if IsCPUID_Available
then
begin
ID := GetCPUID;
result := IntToStr(Abs(ID[1])) + IntToStr(Abs((ID[2]
shr 16)
and $FF))
+ IntToStr(Abs(ID[3])) + IntToStr(Abs(ID[4]));
end
else
result := '
0123456789';
//Dummywert
end;
[add2]
Ach, da es mir grad so schön Spaß macht
, hier nocheine Version, welche wohl besser sein sollte, da hier die Vorzeichenbits nicht ignoriert werden.
Die ersten beiden Funktionen liefern das selbe Erbebnis, aber hier kommt natürlich eventuell was anderes raus, halt wegen der beachteten Vorzeichenbits.
Delphi-Quellcode:
function GetID: string;
var ID: TCPUID;
begin
if IsCPUID_Available then
begin
ID := GetCPUID;
result := Format('%d%d%d%d', [ID[1], (ID[2] shr 16) and $FF, ID[3], ID[4]]);
end
else
result := '0123456789'; //Dummywert
end;
[nachtrag]
und zu dem ID:=GetCPUID;
ich glaub da sollte auffallen, daß es schließlich reicht, wenn nur einmal die Werte von der CPU abgefragt werden und nicht gleich viermal.