線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3016
推到 Plurk!
推到 Facebook!

如何取得CPU的唯一碼

尚未結案
mcho
初階會員


發表:57
回覆:106
積分:42
註冊:2002-11-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-19 11:29:00 IP:220.137.xxx.xxx 未訂閱
請問大大們: 我用D7利用WIN32 API 可取得網路卡及CPU的號碼嗎? 謝謝! 何明昌
------
何明昌
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-19 13:28:36 IP:211.23.xxx.xxx 未訂閱
引言: 請問大大們: 我用D7利用WIN32 API 可取得網路卡及CPU的號碼嗎? 謝謝!
你要的就是這一篇.... http://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_20803727.html ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com
mcho
初階會員


發表:57
回覆:106
積分:42
註冊:2002-11-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-19 16:26:34 IP:220.137.xxx.xxx 未訂閱
HI!aquarius:謝謝您!回應 我依您提示之網頁找好久,都找不到該功能,可否再進一步指點! 何明昌
------
何明昌
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-19 16:40:19 IP:202.39.xxx.xxx 未訂閱
CPU ID: http://www.devarchive.com/download.php?programid=172 Mac Address: http://codecentral.borland.com/codecentral/ccweb.exe/download?id=18097 --- 這次沒買到 cd-pro2 實在很 ...
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-19 16:40:43 IP:211.23.xxx.xxx 未訂閱
都有呀... 把 SOURCE CODE 部份幫你節錄出來好了!!     
/////////////////////////////////////////////////////////////////////////////
// (c) NPS, 1997                  - Idea, realisation, adoptation IsCPUID_Available) //
//                        kvk@estpak.ee                                    //
// (c) Alex Abreu, 1997 - IsCPUID_Available source and idea                //
//                        simonet@bhnet.com.br                             //
/////////////////////////////////////////////////////////////////////////////    interface    uses
  Windows,
  Messages,
  SysUtils,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  ExtCtrls,
  StdCtrls,
  Buttons;    type
  TDemoForm = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    GetButton: TBitBtn;
    CloseButton: TBitBtn;
    Bevel1: TBevel;
    Label5: TLabel;
    FLabel: TLabel;
    MLabel: TLabel;
    PLabel: TLabel;
    SLabel: TLabel;
    PValue: TLabel;
    FValue: TLabel;
    MValue: TLabel;
    SValue: TLabel;
    procedure GetButtonClick(Sender: TObject);
  end;    var
  DemoForm: TDemoForm;    implementation    {$R *.DFM}    const
     ID_BIT     =     $200000;               // EFLAGS ID bit
type
     TCPUID     = array[1..4] of Longint;
     TVendor     = array [0..11] of char;    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;    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;    procedure TDemoForm.GetButtonClick(Sender: TObject);
var
  CPUID : TCPUID;
  I     : Integer;
  S               : TVendor;
begin
     for I := Low(CPUID) to High(CPUID)  do CPUID[I] := -1;
  if IsCPUID_Available then begin
       CPUID     := GetCPUID;
       Label1.Caption := 'CPUID[1] = '   IntToHex(CPUID[1],8);
       Label2.Caption := 'CPUID[2] = '   IntToHex(CPUID[2],8);
       Label3.Caption := 'CPUID[3] = '   IntToHex(CPUID[3],8);
       Label4.Caption := 'CPUID[4] = '   IntToHex(CPUID[4],8);
       PValue.Caption := IntToStr(CPUID[1] shr 12 and 3);
       FValue.Caption := IntToStr(CPUID[1] shr 8 and $f);
       MValue.Caption := IntToStr(CPUID[1] shr 4 and $f);
       SValue.Caption := IntToStr(CPUID[1] and $f);
       S := GetCPUVendor;
       Label5.Caption := 'Vendor: '   S; end
  else begin
       Label5.Caption := 'CPUID not available';
  end;
end;    end. 
     =================================    MAC Address example (works on Win2000 and XP for sure):    uses NB30;    function GetAdapterInfo(Lana: Char): String;
var
 Adapter: TAdapterStatus;
 NCB: TNCB;
begin
 FillChar(NCB, SizeOf(NCB), 0);
 NCB.ncb_command := Char(NCBRESET);
 NCB.ncb_lana_num := Lana;
 if Netbios(@NCB) <> Char(NRC_GOODRET) then
 begin
   Result := 'mac not found';
   Exit;
 end;     FillChar(NCB, SizeOf(NCB), 0); 
 NCB.ncb_command := Char(NCBASTAT); 
 NCB.ncb_lana_num := Lana; 
 NCB.ncb_callname := '*';      FillChar(Adapter, SizeOf(Adapter), 0);
 NCB.ncb_buffer := @Adapter; 
 NCB.ncb_length := SizeOf(Adapter); 
 if Netbios(@NCB) <> Char(NRC_GOODRET) then 
 begin 
   Result := 'mac not found'; 
   Exit; 
 end; 
 Result := 
   IntToHex(Byte(Adapter.adapter_address[0]), 2)   '-'  
   IntToHex(Byte(Adapter.adapter_address[1]), 2)   '-'   
   IntToHex(Byte(Adapter.adapter_address[2]), 2)   '-'   
   IntToHex(Byte(Adapter.adapter_address[3]), 2)   '-'   
   IntToHex(Byte(Adapter.adapter_address[4]), 2)   '-'   
   IntToHex(Byte(Adapter.adapter_address[5]), 2); 
end;     function GetMACAddress: string;
var
 AdapterList: TLanaEnum; 
 NCB: TNCB; 
begin 
 FillChar(NCB, SizeOf(NCB), 0); 
 NCB.ncb_command := Char(NCBENUM); 
 NCB.ncb_buffer := @AdapterList; 
 NCB.ncb_length := SizeOf(AdapterList); 
 Netbios(@NCB); 
 if Byte(AdapterList.length) > 0 then
   Result := GetAdapterInfo(AdapterList.lana[0]) 
 else 
   Result := 'mac not found'; 
end;     // usage
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GetMACAddress);
end;     
還有就是按那一篇的建議到 http://www.torry.net/cpu.htm 去看看, 有不少 Freeware 的元件, 含 SOURCE CODE 的!! ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com
mcho
初階會員


發表:57
回覆:106
積分:42
註冊:2002-11-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-03-23 11:33:39 IP:220.137.xxx.xxx 未訂閱
謝謝二位高手幫忙!我比較笨採用aquarius的SOURCE CODE 所以這一分給aquarius,對hagar只好說:抱歉!我想您不介意吧!本站真是高手如雲,且非常熱心,本人受益甚多! 何明昌
------
何明昌
vagrant
一般會員


發表:29
回覆:72
積分:20
註冊:2003-07-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-18 16:16:34 IP:219.130.xxx.xxx 未訂閱
這個式取得CPUID,不是唯一的 同型號的都是一樣的......
t27
中階會員


發表:34
回覆:95
積分:90
註冊:2002-06-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-07-18 23:58:17 IP:61.230.xxx.xxx 未訂閱
這GetMACAddress在網路連線時可以取得網路卡號, 但在網路離線時,卻無法取得網路卡號,請問是否有其他 方法在網路離線時,可取得網路卡號?
系統時間:2024-05-19 0:09:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!