type
  PASTAT = ^TASTAT;
  TASTAT = record
    adapter : TAdapterStatus;
    name_buf : array [0..29] of TNameBuffer;
  end;function GetNetCardID(): String;
var
  myNcb: TNCB;
  myURetCode: UCHAR;
  myNetName: array[0..49] of Char;
  mylenum: TLanaEnum;
  myCount: Integer;
begin  Result := '';  FillChar(myNcb, sizeof(myNcb), 0);
  myNcb.ncb_command := Char(NCBENUM);
  myNcb.ncb_buffer := PChar(@mylenum);
  myNcb.ncb_length := sizeof(mylenum);
  myURetCode := Byte(Netbios(@myNcb));  for myCount := 0 to integer(mylenum.length) - 1 do
  begin      FillChar(myNcb, sizeof(myNcb), 0);
      myNcb.ncb_command := Char(NCBRESET);
      myNcb.ncb_lana_num := mylenum.lana[myCount];      myURetCode := Byte(Netbios(@myNcb));      FillChar(myNcb, sizeof(myNcb), 0);
      myNcb.ncb_command := Char(NCBASTAT);
      myNcb.ncb_lana_num := mylenum.lana[myCount];      StrPCopy(myNcb.ncb_callname,  '*               ');
      myNcb.ncb_buffer := PChar(@Adapter);
      myNcb.ncb_length := sizeof(Adapter);      myURetCode := Byte(Netbios(@myNcb));      if (myURetCode = 0) then
      begin        Result := IntToHex(byte(Adapter.adapter.adapter_address[0]), 2) + '-' +
          IntToHex(byte(Adapter.adapter.adapter_address[1]), 2) + '-' +
          IntToHex(byte(Adapter.adapter.adapter_address[2]), 2) + '-' +
          IntToHex(byte(Adapter.adapter.adapter_address[3]), 2) + '-' +
          IntToHex(byte(Adapter.adapter.adapter_address[4]), 2) + '-' +
          IntToHex(byte(Adapter.adapter.adapter_address[5]), 2);
      end;   end;end;
如果是开机进入window一会后再开程序调用这个函数就可以返回第一个网卡的mac地址
但是如果是在注册表自动运行程序调用这个函数就有时行有时不行
请问为什么?

解决方案 »

  1.   

    可能是相关的硬件设备还没有准备好吧,弄个timer,没取到就继续取,直到取出想要的数据为止
      

  2.   

    方法不对,应该调用iphelp里的函数,具体例子网上一搜一大把
      

  3.   

    iphelp里的函数SendArp还是不行,开机后一会儿就可以,如果时开机自动运行还是不行
      

  4.   

    等程序启动的时候网卡800年前就初始化完了可以用iphlp里面的函数,GetIFTable等哎,真是不明白,SendArp为啥?要的是本机mac,跟ARP有毛关系啊!