请问老师:
运行程序后,如何获得本机的网卡号或本机的硬盘号?

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        procedure GetAdapterInformation;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    const
      MAX_HOSTNAME_LEN               = 128; { from IPTYPES.H }
      MAX_DOMAIN_NAME_LEN            = 128;
      MAX_SCOPE_ID_LEN               = 256;
      MAX_ADAPTER_NAME_LENGTH        = 256;
      MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
      MAX_ADAPTER_ADDRESS_LENGTH     = 8;type
      TIPAddressString = array[0..4*4-1] of Char;  PIPAddrString = ^TIPAddrString;
      TIPAddrString = record
                      Next     : PIPAddrString;
                      IPAddress: TIPAddressString;
                      IPMask   : TIPAddressString;
                      Context  : Integer;
                      end;  PFixedInfo = ^TFixedInfo;
      TFixedInfo = record { FIXED_INFO }
                   HostName        : array[0..MAX_HOSTNAME_LEN+3] of Char;
                   DomainName      : array[0..MAX_DOMAIN_NAME_LEN+3] of Char;
                   CurrentDNSServer: PIPAddrString;
                   DNSServerList   : TIPAddrString;
                   NodeType        : Integer;
                   ScopeId         : array[0..MAX_SCOPE_ID_LEN+3] of Char;
                   EnableRouting   : Integer;
                   EnableProxy     : Integer;
                   EnableDNS       : Integer;
                   end;  PIPAdapterInfo = ^TIPAdapterInfo;
      TIPAdapterInfo = record { IP_ADAPTER_INFO }
                       Next               : PIPAdapterInfo;
                       ComboIndex         : Integer;
                       AdapterName        : array[0..MAX_ADAPTER_NAME_LENGTH+3] of Char;
                       Description        : array[0..MAX_ADAPTER_DESCRIPTION_LENGTH+3] of Char;
                       AddressLength      : Integer;
                       Address            : array[1..MAX_ADAPTER_ADDRESS_LENGTH] of Byte;
                       Index              : Integer;
                       _Type              : Integer;
                       DHCPEnabled        : Integer;
                       CurrentIPAddress   : PIPAddrString;
                       IPAddressList      : TIPAddrString;
                       GatewayList        : TIPAddrString;
                       DHCPServer         : TIPAddrString;
                       HaveWINS           : Bool;
                       PrimaryWINSServer  : TIPAddrString;
                       SecondaryWINSServer: TIPAddrString;
                       LeaseObtained      : Integer;
                       LeaseExpires       : Integer;
                       end;function GetNetworkParams(FI: PFixedInfo; var BufLen: Integer): Integer;
             stdcall; external 'iphlpapi.dll' Name 'GetNetworkParams';function GetAdaptersInfo(AI: PIPAdapterInfo; var BufLen: Integer): Integer;
             stdcall; external 'iphlpapi.dll' Name 'GetAdaptersInfo';function GetNetworkParameters: string;
    //得到机器的名称
    var
      FI: PFixedInfo;
      Size: Integer;
      Res: Integer;
    begin
      Size := 1024;
      GetMem(FI,Size);
      Res := GetNetworkParams(FI,Size);
      if (Res <> ERROR_SUCCESS) then
      begin
        SetLastError(Res);
        RaiseLastOSError;
      end;
      result := FI^.HostName;
      FreeMem(FI);
    end;function MACToStr(ByteArr: PByte; Len: Integer): string;
    //把MAC转换为字符串
    begin
      Result := '';
      while (Len > 0) do
      begin
        Result := Result+IntToHex(ByteArr^,2)+'-';
        ByteArr := Pointer(Integer(ByteArr)+SizeOf(Byte));
        Dec(Len);
      end;
      SetLength(Result,Length(Result)-1); { remove last dash }
    end;procedure TForm1.GetAdapterInformation;
    //将MAC码写到文本框中
    var
      AI, Work: PIPAdapterInfo;
      Size: Integer;
      Res: Integer;
      I: Integer;
    begin
      Size := 5120;
      GetMem(AI, Size);
      Res := GetAdaptersInfo(AI, Size);
      if (Res <> ERROR_SUCCESS) then
      begin
        SetLastError(Res);
        RaiseLastOSError;
      end;
      with Memo1.Lines do
      begin
        Work := AI;  //适配器信息
        I := 1;
        repeat
          Add('');
          Add('适配器 '+IntToStr(I));      //适配器编号
          Add('  适配器MAC: '+MACToStr(@Work^.Address,Work^.AddressLength));    //MAC
          Inc(I);
          Work := Work^.Next;
        until (Work = nil);
      end;
      FreeMem(AI);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      Memo1.Lines.Clear;
      Memo1.Lines.Add('主机名称:' + GetNetworkParameters);
      GetAdapterInformation;
    end;end.
      

  2.   

    你说的是物理网卡号?
    ARP -A
      

  3.   

    获取硬盘号,对移动硬盘、SCSI盘将失败(返回空串)function GetIdeDiskSerialNumber: string;
    type
      TSrbIoControl = packed record
        HeaderLength: ULONG;
        Signature: array[0..7] of Char;
        Timeout: ULONG;
        ControlCode: ULONG;
        ReturnCode: ULONG;
        Length: ULONG;
      end;
      SRB_IO_CONTROL = TSrbIoControl;
      PSrbIoControl = ^TSrbIoControl;  TIDERegs = packed record
        bFeaturesReg: Byte; // Used for specifying SMART "commands".
        bSectorCountReg: Byte; // IDE sector count register
        bSectorNumberReg: Byte; // IDE sector number register
        bCylLowReg: Byte; // IDE low order cylinder value
        bCylHighReg: Byte; // IDE high order cylinder value
        bDriveHeadReg: Byte; // IDE drive/head register
        bCommandReg: Byte; // Actual IDE command.
        bReserved: Byte; // reserved. Must be zero.
      end;
      IDEREGS = TIDERegs;
      PIDERegs = ^TIDERegs;  TSendCmdInParams = packed record
        cBufferSize: DWORD;
        irDriveRegs: TIDERegs;
        bDriveNumber: Byte;
        bReserved: array[0..2] of Byte;
        dwReserved: array[0..3] of DWORD;
        bBuffer: array[0..0] of Byte;
      end;
      SENDCMDINPARAMS = TSendCmdInParams;
      PSendCmdInParams = ^TSendCmdInParams;  TIdSector = packed record
        wGenConfig: Word;
        wNumCyls: Word;
        wReserved: Word;
        wNumHeads: Word;
        wBytesPerTrack: Word;
        wBytesPerSector: Word;
        wSectorsPerTrack: Word;
        wVendorUnique: array[0..2] of Word;
        sSerialNumber: array[0..19] of Char;
        wBufferType: Word;
        wBufferSize: Word;
        wECCSize: Word;
        sFirmwareRev: array[0..7] of Char;
        sModelNumber: array[0..39] of Char;
        wMoreVendorUnique: Word;
        wDoubleWordIO: Word;
        wCapabilities: Word;
        wReserved1: Word;
        wPIOTiming: Word;
        wDMATiming: Word;
        wBS: Word;
        wNumCurrentCyls: Word;
        wNumCurrentHeads: Word;
        wNumCurrentSectorsPerTrack: Word;
        ulCurrentSectorCapacity: ULONG;
        wMultSectorStuff: Word;
        ulTotalAddressableSectors: ULONG;
        wSingleWordDMA: Word;
        wMultiWordDMA: Word;
        bReserved: array[0..127] of Byte;
      end;
      PIdSector = ^TIdSector;const
      IDE_ID_FUNCTION = $EC;
      IDENTIFY_BUFFER_SIZE = 512;
      DFP_RECEIVE_DRIVE_DATA = $0007C088;
      IOCTL_SCSI_MINIPORT = $0004D008;
      IOCTL_SCSI_MINIPORT_IDENTIFY = $001B0501;
      DataSize = sizeof(TSendCmdInParams) - 1 + IDENTIFY_BUFFER_SIZE;
      BufferSize = SizeOf(SRB_IO_CONTROL) + DataSize;
      W9xBufferSize = IDENTIFY_BUFFER_SIZE + 16;
    var
      hDevice: THandle;
      cbBytesReturned: DWORD;
      pInData: PSendCmdInParams;
      pOutData: Pointer; // PSendCmdOutParams
      Buffer: array[0..BufferSize - 1] of Byte;
      srbControl: TSrbIoControl absolute Buffer;  procedure ChangeByteOrder(var Data; Size: Integer);
      var ptr: PChar;
        i: Integer;
        c: Char;
      begin
        ptr := @Data;
        for i := 0 to (Size shr 1) - 1 do
        begin
          c := ptr^;
          ptr^ := (ptr + 1)^;
          (ptr + 1)^ := c;
          Inc(ptr, 2);
        end;
      end;begin
      Result := '';
      FillChar(Buffer, BufferSize, #0);
      if Win32Platform = VER_PLATFORM_WIN32_NT then
      begin // Windows NT, Windows 2000
        // Get SCSI port handle
        hDevice := CreateFile('\\.\Scsi0:',
          GENERIC_READ or GENERIC_WRITE,
          FILE_SHARE_READ or FILE_SHARE_WRITE,
          nil, OPEN_EXISTING, 0, 0);
        if hDevice = INVALID_HANDLE_value then Exit;
        try
          srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL);
          System.Move('SCSIDISK', srbControl.Signature, 8);
          srbControl.Timeout := 2;
          srbControl.Length := DataSize;
          srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY;
          pInData := PSendCmdInParams(PChar(@Buffer)
            + SizeOf(SRB_IO_CONTROL));
          pOutData := pInData;
          with pInData^ do
          begin
            cBufferSize := IDENTIFY_BUFFER_SIZE;
            bDriveNumber := 0;
            with irDriveRegs do
            begin
              bFeaturesReg := 0;
              bSectorCountReg := 1;
              bSectorNumberReg := 1;
              bCylLowReg := 0;
              bCylHighReg := 0;
              bDriveHeadReg := $A0;
              bCommandReg := IDE_ID_FUNCTION;
            end;
          end;
          if not DeviceIoControl(hDevice, IOCTL_SCSI_MINIPORT,
            @Buffer, BufferSize, @Buffer, BufferSize,
            cbBytesReturned, nil) then Exit;
        finally
          CloseHandle(hDevice);
        end;
      end
      else
      begin // Windows 95 OSR2, Windows 98
        hDevice := CreateFile('\\.\SMARTVSD', 0, 0, nil,
          CREATE_NEW, 0, 0);
        if hDevice = INVALID_HANDLE_value then Exit;
        try
          pInData := PSendCmdInParams(@Buffer);
          pOutData := @pInData^.bBuffer;
          with pInData^ do
          begin
            cBufferSize := IDENTIFY_BUFFER_SIZE;
            bDriveNumber := 0;
            with irDriveRegs do
            begin
              bFeaturesReg := 0;
              bSectorCountReg := 1;
              bSectorNumberReg := 1;
              bCylLowReg := 0;
              bCylHighReg := 0;
              bDriveHeadReg := $A0;
              bCommandReg := IDE_ID_FUNCTION;
            end;
          end;
          if not DeviceIoControl(hDevice, DFP_RECEIVE_DRIVE_DATA,
            pInData, SizeOf(TSendCmdInParams) - 1, pOutData,
            W9xBufferSize, cbBytesReturned, nil) then Exit;
        finally
          CloseHandle(hDevice);
        end;
      end;
      with PIdSector(PChar(pOutData) + 16)^ do
      begin
        ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));
        SetString(Result, sSerialNumber, SizeOf(sSerialNumber));
      end;
    end;
    关于网卡地址,在网上有很多现成的代码,
    在笔记本上通常会发生机器重启后,取的MAC地址错误。
    主要原因是网卡序号发生变化,但用IPCONFIG将可以正确取到该地址,
    在使用IPCONFIG时如果禁用网络停止相关服务将不能取到网卡地址。