İşlemci seri numarası

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
erkan1525
Üye
Mesajlar: 113
Kayıt: 12 Ağu 2014 01:31

İşlemci seri numarası

Mesaj gönderen erkan1525 »

Merhaba,
Delphide işlemci seri numarasını öğrenebileceğim bir kod bulamadum. Netten bulduğum birkaç fonksiyonu denedim ama bunlarda birçok bilgisayarda aynı numarayı veriyor. Core 2 Duo ve i5 işlemciye aynı numarayı verdi. AMD ye farklı numara verebildi.
Kod aşağıda

Kod: Tümünü seç

Function CPUID :dWORD; assembler;
asm
PUSH EBX
PUSH EDI
MOV EAX,1
DW $A20F
MOV @Result,EDX
POP EDI
POP EBX
end;
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: İşlemci seri numarası

Mesaj gönderen unicorn64 »

:ara Delphide işlemci seri numarası kelimlerini google arayınca baya bir şey çıktı...
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
erkan1525
Üye
Mesajlar: 113
Kayıt: 12 Ağu 2014 01:31

Re: İşlemci seri numarası

Mesaj gönderen erkan1525 »

unicorn64 yazdı::ara Delphide işlemci seri numarası kelimlerini google arayınca baya bir şey çıktı...
O bayağa birşeylerin içinde doğru düzgün birşey yok. Anlaşılmıyor veya işe yapamıyor yada gereksiz sayfalarca kod içerdiğinden temizleyip sadece işime yarayanı alamıyorum.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: İşlemci seri numarası

Mesaj gönderen SimaWB »

CPU ile ilgili bilgilere WMI kullanarak ve Win32_Processor sınıfını araştırarak ulaşabilirsiniz.
Emin değilim ama aradığınız değer bu sınıfın ProcessorId özelliği olabilir.

ProcessorId'yi okumak için basit bir örnek:

Kod: Tümünü seç

procedure TForm3.Button10Click(Sender: TObject);
var
  FSWbemLocator,FWMIService,FWbemObjectSet,FWbemObject: OLEVariant;
  oEnum: IEnumvariant;
  iValue: LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
  FWbemObjectSet:= FWMIService.ExecQuery('Select * from Win32_Processor','WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  oEnum.Next(1, FWbemObject, iValue);
  ShowMessage(VarToStr(FWbemObject.ProcessorId));
  FWbemObject := Unassigned;
end;
There's no place like 127.0.0.1
erkan1525
Üye
Mesajlar: 113
Kayıt: 12 Ağu 2014 01:31

Re: İşlemci seri numarası

Mesaj gönderen erkan1525 »

SimaWB yazdı:CPU ile ilgili bilgile...........
Yok abim vazgeçtim ben. Başka yöntem kullanacam. Şimdi Visual basicde bunu yapan kodlarım var bir api kullanıyor. Aynı şeyi delphide nasıl yaparım? Yani oradaki herhangi bir API yı nasıl delphide kullanırım?
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Re: İşlemci seri numarası

Mesaj gönderen PROGRAMADOR »

Şu kodu dener misiniz?

Kod: Tümünü seç

function cpuid: dword;
const
  ID_BIT = $200000; // EFLAGS ID bit
type
  TCPUID = array[1..4] of Longint;
var
  CPUID: TCPUID;
  I: integer;

    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 GetCPUID: 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;

begin
  for I := Low(CPUID) to High(CPUID) do CPUID[I] := -1;
  if IsCPUID_Available then CPUID := GetCPUID;
  Result := 10000 * CPUID[1] + CPUID[4];
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//
Memo1.Lines.Add(floattostr(cpuid));

end;
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
nodetail
Üye
Mesajlar: 74
Kayıt: 04 Eki 2008 10:30

Re: İşlemci seri numarası

Mesaj gönderen nodetail »

Arkadaşlar bu kodu kullanan/test eden oldu mu hiç her bilgisayara özel bir koda ihtiyacım var işlemci seri numarası gibi,bu kod şuana kadar düzgün çalışıyor ancak formatta veya parça değişimlerinde değişiyor mu test edemedim
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: İşlemci seri numarası

Mesaj gönderen ertank »

Merhaba,

Bu tarz assembler kodlarını kullanmamaya gayret ediyorum. Çoğu 32bit işletim sistemi destekli olup 64bit uygulamalarda sorun çıkarıyor.

Aşağıdaki kütüphaneden memnunum. Anakart ile ilgili birçok bilgiye ulaşabilirsiniz. Ancak tek başına herşeyi çözmez. Farklı donanımlar için (sabit disk, ethernet vb) bunun yanında ek koda ihtiyaç olur.
https://github.com/RRUZ/tsmbios/
Cevapla