Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如果从internet断开连接,getmac address返回空白_Delphi_Winapi_Delphi 7 - Fatal编程技术网

Delphi 如果从internet断开连接,getmac address返回空白

Delphi 如果从internet断开连接,getmac address返回空白,delphi,winapi,delphi-7,Delphi,Winapi,Delphi 7,我正在尝试获取我的客户端计算机的mac地址,如果计算机连接到internet,该地址可以正常工作,但一旦计算机断开与internet的连接,mac地址将返回空白 你知道为什么吗?如果我可以使用任何可靠的函数,因为我从命令行运行的windows getmac始终返回mac地址,而不管它是否连接到internet。 无论如何,我都可以使用delphi调用getmac函数 我使用这个代码 function GetMACAdress: string; var NCB: PNCB; Adapter

我正在尝试获取我的客户端计算机的mac地址,如果计算机连接到internet,该地址可以正常工作,但一旦计算机断开与internet的连接,mac地址将返回空白

你知道为什么吗?如果我可以使用任何可靠的函数,因为我从命令行运行的windows getmac始终返回mac地址,而不管它是否连接到internet。 无论如何,我都可以使用delphi调用getmac函数

我使用这个代码

function GetMACAdress: string;
var
  NCB: PNCB;
  Adapter: PAdapterStatus;

  URetCode: PChar;
  RetCode: char;
  I: integer;
  Lenum: PlanaEnum;
  _SystemID: string;
  TMPSTR: string;
begin
  Result    := '';
  _SystemID := '';
  Getmem(NCB, SizeOf(TNCB));
  Fillchar(NCB^, SizeOf(TNCB), 0);

  Getmem(Lenum, SizeOf(TLanaEnum));
  Fillchar(Lenum^, SizeOf(TLanaEnum), 0);

  Getmem(Adapter, SizeOf(TAdapterStatus));
  Fillchar(Adapter^, SizeOf(TAdapterStatus), 0);

  Lenum.Length    := chr(0);
  NCB.ncb_command := chr(NCBENUM);
  NCB.ncb_buffer  := Pointer(Lenum);
  NCB.ncb_length  := SizeOf(Lenum);
  RetCode         := Netbios(NCB);

  i := 0;
  repeat
    Fillchar(NCB^, SizeOf(TNCB), 0);
    Ncb.ncb_command  := chr(NCBRESET);
    Ncb.ncb_lana_num := lenum.lana[I];
    RetCode          := Netbios(Ncb);

    Fillchar(NCB^, SizeOf(TNCB), 0);
    Ncb.ncb_command  := chr(NCBASTAT);
    Ncb.ncb_lana_num := lenum.lana[I];
    // Must be 16
    Ncb.ncb_callname := '*               ';

    Ncb.ncb_buffer := Pointer(Adapter);

    Ncb.ncb_length := SizeOf(TAdapterStatus);
    RetCode        := Netbios(Ncb);
    //---- calc _systemId from mac-address[2-5] XOR mac-address[1]...
    if (RetCode = chr(0)) or (RetCode = chr(6)) then
    begin
      _SystemId := IntToHex(Ord(Adapter.adapter_address[0]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[1]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[2]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[3]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[4]), 2) + '-' +
        IntToHex(Ord(Adapter.adapter_address[5]), 2);
    end;
    Inc(i);
  until (I >= Ord(Lenum.Length)) or (_SystemID <> '00-00-00-00-00-00');
  FreeMem(NCB);
  FreeMem(Adapter);
  FreeMem(Lenum);
  GetMacAdress := _SystemID;
end;
函数getMacAddress:string; 变量 国家编目局:国家编目局; 适配器:PAdapterStatus; 脲码:PChar; RetCode:char; I:整数; 晶状体:扁平; _SystemID:string; TMPSTR:字符串; 开始 结果:=''; _系统ID:=''; Getmem(国家编目局,国家编目局); Fillchar(NCB^,SizeOf(TNCB),0); Getmem(Lenum,SizeOf(TLanaEnum)); Fillchar(Lenum^,SizeOf(TLanaEnum),0); Getmem(适配器,SizeOf(TAdapterStatus)); Fillchar(适配器^,SizeOf(TAdapterStatus),0); 透镜长度:=chr(0); NCB.NCB_命令:=chr(NCBENUM); NCB.NCB_缓冲区:=指针(Lenum); NCB.NCB_长度:=SizeOf(Lenum); RetCode:=Netbios(NCB); i:=0; 重复 Fillchar(NCB^,SizeOf(TNCB),0); Ncb.Ncb_命令:=chr(NCBRESET); Ncb.Ncb_lana_num:=lenum.lana[I]; RetCode:=Netbios(Ncb); Fillchar(NCB^,SizeOf(TNCB),0); Ncb.Ncb_命令:=chr(NCBASTAT); Ncb.Ncb_lana_num:=lenum.lana[I]; //必须是16岁 Ncb.Ncb_callname:='*'; Ncb.Ncb_缓冲区:=指针(适配器); Ncb.Ncb_长度:=SizeOf(TAdapterStatus); RetCode:=Netbios(Ncb); //----从mac地址[2-5]或XOR mac地址[1]计算systemId。。。 如果(RetCode=chr(0))或(RetCode=chr(6)),则 开始 _SystemId:=IntToHex(Ord(Adapter.Adapter_地址[0]),2)+'-'+ IntToHex(Ord(适配器.适配器地址[1]),2)+'-'+ IntToHex(Ord(适配器.适配器地址[2]),2)+'-'+ IntToHex(Ord(适配器.适配器地址[3]),2)+'-'+ IntToHex(Ord(适配器.适配器地址[4]),2)+'-'+ IntToHex(Ord(适配器.适配器地址[5]),2); 结束; 公司(一); 直到(I>=Ord(透镜长度))或(_SystemID'00-00-00-00-00'); FreeMem(国家编目局); FreeMem(适配器); FreeMem(Lenum); GetMacAddress:=\u系统ID; 结束;
不要使用NetBios。使用或代替。还要记住,一台机器可能安装了多个网络适配器,因此有多个MAC地址可用。

FWIW,这里的动态分配是一种反模式。声明适当类型的变量,并使用
@
获取它们的地址。嗨,雷米,谢谢你的回复,但你有我可以使用的示例吗,我发现了另一个代码,但在某些计算机上也是一样的,如果没有连接到internet,它将返回空白的Mac地址。我提供的两个链接将确切地告诉您如何使用这些功能。只要把它们翻译成德尔福,没那么难。在任何情况下,网络适配器都不必连接到网络才能拥有MAC。
getAdapterInfo()
getAdapterAddresses()
都为已安装的适配器提供MAC地址,无论它们是否连接到任何网络。