function SOCKET_ADDRESS_ToString(const Addr: SOCKET_ADDRESS):String; var Len: DWORD; begin Result := ''; if (Addr.lpSockaddr <> nil) and (Addr.iSockaddrLength > 0) then begin Len := 0; WSAAddressToString(Addr.lpSockaddr, Addr.iSockaddrLength, nil, nil, Len); // 这行不能编译 SetLength(Result, Len); if WSAAddressToString(Addr.lpSockaddr, Addr.iSockaddrLength, nil, PChar(Result), Len) = 0 then SetLength(Result, Len - 1) else Result := ''; end; end;
if (Status <> ERROR_SUCCESS) then begin case Status of ERROR_NOT_SUPPORTED: strings.Add('GetAdaptersInfo is not supported by the operating ' + 'system running on the local computer.'); ERROR_NO_DATA: strings.Add('No network adapter on the local computer.'); else strings.Add('GetAdaptersInfo failed with error #' + IntToStr(Status)); end; Dispose(pAdapterInfo); Exit; end;
while (pAdapterInfo <> nil) do begin strings.Add('Description: ' + pAdapterInfo^.Description); strings.Add('Name: ' + pAdapterInfo^.AdapterName);
strMAC := ''; for I := 0 to pAdapterInfo^.AddressLength - 1 do strMAC := strMAC + '-' + IntToHex(pAdapterInfo^.Address[I], 2);
有引用Winsock2,但仍无 RtlIpv4StringToAddressA。 参考了Indy的代码,自己写转换了: function InAddrToString(var AInAddr; const AIPVersion: TIdIPVersion): string; begin case AIPVersion of Id_IPv4: begin //RtlIpv4AddressToString(); with TIdIn4Addr(AInAddr).S_un_b do Result:=Format('%d.%d.%d.%d',[s_b1,s_b2,s_b3,s_b4]); end; Id_IPv6: begin //RtlIpv6AddressToString(); with TIdIn6Addr(AInAddr) do Result := Format('%s:%s:%s:%s:%s:%s:%s:%s', [NetworkToHost(s6_addr16[0]), NetworkToHost(s6_addr16[1]), NetworkToHost(s6_addr16[2]), NetworkToHost(s6_addr16[3]), NetworkToHost(s6_addr16[4]), NetworkToHost(s6_addr16[5]), NetworkToHost(s6_addr16[6]), NetworkToHost(s6_addr16[7])]); end; else begin Result := ''; //IPVersionUnsupported; end; end; end;
----------------------------------------------
-
//var AInAddr TRtlIpv4AddressToStringA = function (addres:pointer;char:pointer): THandle; stdcall; var RtlIpv4AddressToStringA: TRtlIpv4AddressToStringA; var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var cr:array [1..30] of byte;(此处注意内存zero) cr1:array [1..30] of ansichar;(此处注意内存zero) begin cr[1]:=199; cr[2]:=188; cr[3]:=1; cr[4]:=166; RtlIpv4AddressToStringA := GetProcAddress(GetModuleHandle('NTDLL.DLL'), 'RtlIpv4AddressToStringA'); if not Assigned(RtlIpv4AddressToStringA) then showmessage('test'); RtlIpv4AddressToStringA(@cr,@cr1); showmessage(cr1); end;