function GetAdapterSN(num: integer): string;
var
  ibuf: array [0..5] of Byte;
  sn: string[12];
  i: integer;
  st: string;
  pbuf: PChar;
  ncb: TNCB;
  uRetCode: CHAR;
  lana_enum: TLANAENUM;
begin
  FillChar(ncb, sizeof(ncb), 0);
  ncb.ncb_command := Char(NCBENUM);
  uRetCode := Netbios( @ncb );
  ncb.ncb_buffer := @lana_enum;
  ncb.ncb_length := sizeof(lana_enum);
  uRetCode := Netbios( @ncb );// 获取网卡数量、编号信息。 此处返回值总是 7   
//  NRC_BADDR       = $07;    // illegal buffer address
  if uRetCode = #0 then
......调试系统是 XP, 请问如何改正?

解决方案 »

  1.   

    已经解决。采用SendARP方法可以获取IP。
    分不能给自己,删除贴子又没有信誉。
    大家顶吧,这50分一定要送出去呀。
      

  2.   

    To:ahjoe(强哥) 能否共享你的成果吗?如何采用SendARP方法可以获取IP。
      

  3.   

    // 在XP下用NetBios取MAC有时会失败.
    // 用SendARP获取MAC (我在win98使用该函数得不到MAC)
    function SendARP( const DestIP : DWord; const SrcIP : DWord;
                      const pMacAddr : Pointer; const PhyAddrLen : PULONG) : DWord;
                      stdcall; external 'IPHLPAPI.DLL' name 'SendARP';....
    function GetRemoteMAC(ip:string):String;
    var
      dwResult : DWord;
      ulIPAddr : DWord;
      ulMACAddr : Array [0..5] of Byte;
      ulAddrLen : ULONG;
    begin
      ulIPAddr := inet_addr(PChar(ip));
      ulAddrLen := 6;
      FillChar(ulMACAddr, 6, $ff);
      dwResult := SendARP(ulIPAddr,0,@ulMACAddr,@ulAddrLen);
      if dwResult=0 then
        Result:=(IntToHex(ulMACAddr[0],2)+
                    IntToHex(ulMACAddr[1],2)+
                    IntToHex(ulMACAddr[2],2)+
                    IntToHex(ulMACAddr[3],2)+
                    IntToHex(ulMACAddr[4],2)+
                    IntToHex(ulMACAddr[5],2));
    end;
      

  4.   

    交流一下,我的方法var
    //  vMac:String;
      vtmpPath,vtmpFile:Pchar;
      vOrder,vNewName:String;
      vF:Integer;
      vFile:PChar;
      F:TextFile;
    begin
      vtmpPath:=GetMemory(MAX_PATH);
      vtmpFile:=GetMemory(MAX_PATH);
      GetTempPath(MAX_PATH,vtmpPath);
      GetTempFileName(vtmpPath,'sh',0,vtmpFile);
      vNewName:=ChangeFileExt(vtmpFile,'.bat');
      vOrder:=format('nbtstat -a %s >%s',[AServerName,StrPas(vtmpFile)]);
      AssignFile(F,vNewName);
      Rewrite(F);
      Writeln(F,vOrder);
      CloseFile(F);
      ShellExecute(Application.Handle,'open',PChar(vNewName),nil,nil,SW_HIDE);
      Sleep(300);
      vF:=FileOpen(StrPas(vtmpFile),fmOpenRead);
      FileSeek(vF,0,0);
      vSize:=FileSeek(vF,0,2);
      FileSeek(vF,0,0);
      vFile:=PChar(AllocMem(vSize + 1));
      FileRead(vF,vFile^,vSize);
      FileClose(vF);
      Result:=ReadMacAddr(StrPas(vFile));
      DeleteFile(StrPas(vtmpFile));
      DeleteFile(vNewName);
      FreeMem(vtmpPath);
      FreeMem(vtmpFile);
      

  5.   

    原来是调用nbtstat 生成文件,可以用管道重定向nbstat的标准输出,就不用临时文件了
      

  6.   

    To:ahjoe(强哥) inet_addr 没有给出定义类型
      

  7.   

    inet_addr 在 winsock 单元