可在NT下取得網路卡編號的範例程式 |
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
可在NT下取得網路卡編號的範例程式
有原始程式與執行檔,compile in delphi 5.0
感謝網友alexyip007與原創作者Vlad Sharnin,
以下列出重要程式片段
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, NB30; type TGetMACForm = class(TForm) Edit1: TEdit; ComboBox1: TComboBox; MACAddrButton: TButton; ResetButton: TButton; Label1: TLabel; Label2: TLabel; procedure MACAddrButtonClick(Sender: TObject); procedure ResetButtonClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ComboBox1Change(Sender: TObject); private { Private declarations } public { Public declarations } end; var GetMACForm: TGetMACForm; implementation {$R *.DFM} type TNBLanaResources = (lrAlloc, lrFree); type PMACAddress = ^TMACAddress; TMACAddress = array[0..5] of Byte; // Get the list of adapters function GetLanaEnum(LanaEnum: PLanaEnum): Byte; var LanaEnumNCB: PNCB; begin New(LanaEnumNCB); ZeroMemory(LanaEnumNCB, SizeOf(TNCB)); try with LanaEnumNCB^ do begin ncb_buffer := PChar(LanaEnum); ncb_length := SizeOf(TLanaEnum); ncb_command := Char(NCBENUM); NetBios(LanaEnumNCB); Result := Byte(ncb_cmd_cplt); end; finally Dispose(LanaEnumNCB); end; end; procedure TGetMACForm.FormCreate(Sender: TObject); var LanaEnum: PLanaEnum; I: Integer; begin Edit1.Text := ''; New(LanaEnum); ZeroMemory(LanaEnum, SizeOf(TLanaEnum)); try if GetLanaEnum(LanaEnum) = NRC_GOODRET then begin with ComboBox1, Items do begin Sorted := True; BeginUpdate; Clear; for I := 0 to Byte(LanaEnum.length) - 1 do Add(IntToStr(Byte(LanaEnum.lana[I]))); ItemIndex := 0; EndUpdate; end; end; finally Dispose(LanaEnum); end; ResetButton.Enabled := (Win32Platform = VER_PLATFORM_WIN32_NT); end; function ResetLana(LanaNum, ReqSessions, ReqNames: Byte; LanaRes: TNBLanaResources): Byte; var ResetNCB: PNCB; begin New(ResetNCB); ZeroMemory(ResetNCB, SizeOf(TNCB)); try with ResetNCB^ do begin ncb_lana_num := Char(LanaNum); // Set Lana_Num ncb_lsn := Char(LanaRes); // Allocation of new resources ncb_callname[0] := Char(ReqSessions); // Query of max sessions ncb_callname[1] := #0; // Query of max NCBs (default) ncb_callname[2] := Char(ReqNames); // Query of max names ncb_callname[3] := #0; // Query of use NAME_NUMBER_1 ncb_command := Char(NCBRESET); NetBios(ResetNCB); Result := Byte(ncb_cmd_cplt); end; finally Dispose(ResetNCB); end; end; function GetMACAddress(LanaNum: Byte; MACAddress: PMACAddress): Byte; var AdapterStatus: PAdapterStatus; StatNCB: PNCB; begin New(StatNCB); ZeroMemory(StatNCB, SizeOf(TNCB)); StatNCB.ncb_length := SizeOf(TAdapterStatus) 255 * SizeOf(TNameBuffer); GetMem(AdapterStatus, StatNCB.ncb_length); try with StatNCB^ do begin ZeroMemory(MACAddress, SizeOf(TMACAddress)); ncb_buffer := PChar(AdapterStatus); ncb_callname := '* ' #0; ncb_lana_num := Char(LanaNum); ncb_command := Char(NCBASTAT); NetBios(StatNCB); Result := Byte(ncb_cmd_cplt); if Result = NRC_GOODRET then MoveMemory(MACAddress, AdapterStatus, SizeOf(TMACAddress)); end; finally FreeMem(AdapterStatus); Dispose(StatNCB); end; end; procedure TGetMACForm.MACAddrButtonClick(Sender: TObject); var LanaNum: Byte; MACAddress: PMACAddress; RetCode: Byte; begin LanaNum := StrToInt(ComboBox1.Text); //********** MODIFY ********** RetCode := ResetLana(LanaNum, 0, 0, lrAlloc); if RetCode <> NRC_GOODRET then begin Beep; ShowMessage('Reset Error! RetCode = $' IntToHex(RetCode, 2)); end; //**************************** New(MACAddress); try if RetCode = NRC_GOODRET then begin Edit1.Text := Format('%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x', [MACAddress[0], MACAddress[1], MACAddress[2], MACAddress[3], MACAddress[4], MACAddress[5]]); end else begin Beep; Edit1.Text := 'Error'; ShowMessage('GetMACAddress Error! RetCode = $' IntToHex(RetCode, 2)); end; finally Dispose(MACAddress); end; end; procedure TGetMACForm.ResetButtonClick(Sender: TObject); var RetCode: Byte; LanaNum: Byte; begin LanaNum := StrToInt(ComboBox1.Text); RetCode := ResetLana(LanaNum, 0, 0, lrAlloc); if RetCode <> NRC_GOODRET then begin Beep; ShowMessage('Reset Error! RetCode = $' IntToHex(RetCode, 2)); end; end; procedure TGetMACForm.ComboBox1Change(Sender: TObject); begin Edit1.Text := ''; end; end. [/code] ~~~Delphi K.Top網站總管~~~
------
~~~Delphi K.Top討論區站長~~~
附加檔案:17963_getmac.zip
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |