如何获得机器得MAC地址?用哪个函数。谢谢先!

解决方案 »

  1.   


    type
     TNBLanaResources = (lrAlloc, lrFree);
    type
     PMACAddress = ^TMACAddress;
     TMACAddress = array[0..5] of Byte;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;
    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 NBGetAdapterAddress(a: integer): String;
    Var
      NC:TNCB;
      ADAPTE : TADAPTERSTATUS;
      LANAENU : TLANAENUM;
      intId : Integer;
      cR : Char;
      strTem : String; 
    Begin
      Result := '';
      Try
        ZeroMemory(@NC, SizeOf(NC));  
        NC.ncb_command:=Chr(NCBENUM);
        cR := NetBios(@NC); 
        // Reissue enum command
        NC.ncb_buffer := @LANAENU;
        NC.ncb_length := SizeOf(LANAENU);
        cR := NetBios(@NC);
        If Ord(cR)<>0 Then
          exit;
        ZeroMemory(@NC, SizeOf(NC));
        NC.ncb_command := Chr(NCBRESET);
        NC.ncb_lana_num := LANAENU.lana[a];
        cR := NetBios(@NC);
        If Ord(cR)<>0 Then
          exit;
        ZeroMemory(@NC, SizeOf(NC));
        NC.ncb_command := Chr(NCBASTAT);
        NC.ncb_lana_num := LANAENU.lana[a];
        StrPCopy(NC.ncb_callname, '*');
        NC.ncb_buffer := @ADAPTE;
        NC.ncb_length := SizeOf(ADAPTE);
        cR := NetBios(@NC);
        strTem := '';
        For intId := 0 To 5 Do
          strTem := strTem+ InttoHex(Integer(ADAPTE.adapter_address[intId]),2);
        Result := strTem;
      Finally
      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 GetBuildInfo(var m1, m2,r, b: Word);
    var
      VerInfoSize: DWORD;
      VerInfo: Pointer;
      VerValueSize: DWORD;
      VerValue: PVSFixedFileInfo;
      Dummy: DWORD;
    begin
      VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);
      GetMem(VerInfo, VerInfoSize);
      GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
      if VerInfo <> nil then
      begin
        VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
        with VerValue^ do
        begin
          m1 := dwFileVersionMS shr 16;
          m2 := dwFileVersionMS and $FFFF;
          r := dwFileVersionLS shr 16;
          b := dwFileVersionLS and $FFFF;
        end;
      end
      else
       begin
         m1:=1;
         m2:=1;
       end;
      FreeMem(VerInfo, VerInfoSize);
    end;Function GetMacFunction:String ;
    var
      LanaNum: Byte;
      MACAddress: PMACAddress;
      RetCode: Byte;
      StrAddr:String ;
    begin
      RetCode := ResetLana(0, 0, 0, lrAlloc);
      New(MACAddress);
      try
        RetCode := GetMACAddress(0, MACAddress);
        if RetCode = NRC_GOODRET then
        begin
         // StrAddr := Format('%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x',
          StrAddr := 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]]);
           Result:=  StrAddr;
        end else
        begin
          Beep;
          //ShowMessage('GetMACAddress Error! RetCode = $' + IntToHex(RetCode, 2));
        end;
      finally
        Dispose(MACAddress);
      end;
    end;
      

  2.   

    有几种方法:
     一。 WINEXEC(PCHAR('CMD /C  IPCONFIG /ALL > C:\TEMP.TXT'),SW_HIDE);
    二。
    如何取的網卡的MAC號
    簡介:
    function TForm1.NBGetAdapterAddress(a: integer): String;
    //a指定多個網卡適配器中的哪一個0,1,2...
    Var
    NCB:TNCB; // Netbios control block file://NetBios控制塊
    ADAPTER : TADAPTERSTATUS; // Netbios adapter status//取網卡狀態
    LANAENUM : TLANAENUM; // Netbios lana
    intIdx : Integer; // Temporary work value//臨時變數
    cRC : Char; // Netbios return code//NetBios返回值
    strTemp : String; // Temporary string//臨時變數Begin
    // Initialize
    Result := '';
    Try
    // Zero control blocl
    ZeroMemory(@NCB, SizeOf(NCB));
    // Issue enum command
    NCB.ncb_command:=Chr(NCBENUM);
    cRC := NetBios(@NCB);
    // Reissue enum command
    NCB.ncb_buffer := @LANAENUM;
    NCB.ncb_length := SizeOf(LANAENUM);
    cRC := NetBios(@NCB);
    If Ord(cRC)0 Then
    exit;
    // Reset adapter
    ZeroMemory(@NCB, SizeOf(NCB));
    NCB.ncb_command := Chr(NCBRESET);
    NCB.ncb_lana_num := LANAENUM.lana[a];
    cRC := NetBios(@NCB);
    If Ord(cRC)0 Then
    exit;
    // Get adapter address
    ZeroMemory(@NCB, SizeOf(NCB));
    NCB.ncb_command := Chr(NCBASTAT);
    NCB.ncb_lana_num := LANAENUM.lana[a];
    StrPCopy(NCB.ncb_callname, '*');
    NCB.ncb_buffer := @ADAPTER;
    NCB.ncb_length := SizeOf(ADAPTER);
    cRC := NetBios(@NCB);
    // Convert it to string
    strTemp := '';
    For intIdx := 0 To 5 Do
    strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[intIdx]),2);
    Result := strTemp;
    Finally
    End;最後別忘了uses nb30.pas
    經測試,98,2000下皆可用