type ASTAT =record adapt:TADAPTERSTATUS ; NameBuff:array[0..30] of TNameBuffer; end; New_byte=array[0..5] of byte; var
NewByte:New_Byte; procedure TfrmMain.GetNetCardAddress; var ncb:^TNCB; AdapterList:^TLanaEnum; ret:Char; i,K:integer; Adapter:^ASTAT; textt:string; // pAdd:string; // m_byteAddressMySelf:string; // m_ctrlThisNetCard:TStrings; begin // m_ctrlThisNetCard:=TStringList.Create; getMem(ncb,sizeof(TNCB)); getMem(AdapterList,sizeof(TLanaEnum)); ncb^.ncb_command:=char(NCBENUM); Ncb^.ncb_buffer := pchar(AdapterList); Ncb^.ncb_length := sizeof(AdapterList); // ret :=Netbios(PNCB(ncb)); Netbios(PNCB(ncb)); if (Ncb^.ncb_retcode<>char(NRC_GOODRET)) then exit; For I:=0 to ord(AdapterList^.Length) do begin getmem(ncb,sizeof(TNCB)); Ncb^.ncb_command := char(NCBRESET); Ncb^.ncb_lana_num := AdapterList.lana[i]; if (Netbios(PNCB(Ncb)) <> char(NRC_GOODRET)) then exit;
if (ret<> #0) then exit; for K:=0 to 5 do if(Adapter^.adapt.adapter_address[K]<>#0)then break; if(K>=6)then continue; textt:=format('%.02X %.02X %.02X %.02X %.02X %.02X', [ord(Adapter^.adapt.adapter_address[0]), ord(Adapter^.adapt.adapter_address[1]), ord(Adapter^.adapt.adapter_address[2]), ord(Adapter^.adapt.adapter_address[3]), ord(Adapter^.adapt.adapter_address[4]), ord(Adapter^.adapt.adapter_address[5])]); if(m_ctrlThisNetCard.items.IndexOf(textt)=LB_ERR)then m_ctrlThisNetCard.items.Add(textt); end;
end;
function TfrmMain.HextoDec(const Hex: string): integer; var I:integer; C:char; Value:integer; begin value:=0; For I:=1 to Length(Hex) do begin C:=Hex[I]; if(C>='A') and (C<='F')then value:=Value*10+(ord(C)-ord('A')+10) else Value:=Value*10+(ord(C)-ord('0')); end; result:=Value; end; function TfrmMain.SetStringtobyte(var NewByte: New_byte; const SourceStr: string): boolean; var str,tmp:string; start,I:integer; begin try For I:=0 to 5 do NewByte[I]:=0; tmp:=Uppercase(SourceStr+' '); for I:=0 to 5 do begin start:=pos(' ',tmp); inc(start,-1); str:=copy(tmp,0,start); NewByte[I]:=HextoDec(str); tmp:=copy(tmp,start+1,length(tmp)-start); tmp:=trimLeft(tmp); end; result:=True; except result:=False; end; end;
// Fetches the MAC address and prints it static void GetMACaddress(void) { IP_ADAPTER_INFO AdapterInfo[16]; // Allocate information // for up to 16 NICs DWORD dwBufLen = sizeof(AdapterInfo); // Save memory size of buffer
DWORD dwStatus = GetAdaptersInfo( // Call GetAdapterInfo AdapterInfo, // [out] buffer to receive data &dwBufLen); // [in] size of receive data buffer assert(dwStatus == ERROR_SUCCESS); // Verify return value is // valid, no buffer overflow
PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo; // Contains pointer to // current adapter info do { PrintMACaddress(pAdapterInfo->Address); // Print MAC address pAdapterInfo = pAdapterInfo->Next; // Progress through // linked list } while(pAdapterInfo); // Terminate if last adapter }
具体函数查MSDN和PSDK
function LocalIP:string; type TaPInAddr = array [0..10] of PInAddr; PaPInAddr = ^TaPInAddr; var phe : PHostEnt; pptr : PaPInAddr; Buffer : array [0..63] of char; I : Integer; GInitData : TWSADATA;begin WSAStartup($101, GInitData); Result := ''; GetHostName(Buffer, SizeOf(Buffer)); phe :=GetHostByName(buffer); if phe = nil then Exit; pptr := PaPInAddr(Phe^.h_addr_list); I := 0; while pptr^[I] <> nil do begin result:=StrPas(inet_ntoa(pptr^[I]^)); Inc(I); end; WSACleanup; end; ======================================== program get_ip; uses winsock,sysutils; VAR ch : ARRAY[1..32] OF Char; i : Integer; WSData: TWSAData; MyHost: PHostEnt; begin IF WSAstartup(2,wsdata)<>0 THEN BEGIN Writeln('can''t start Winsock: Error ',WSAGetLastError); Halt(2); END; try IF getHostName(@ch[1],32)<>0 THEN BEGIN Writeln('getHostName failed'); Halt(3); END; except Writeln('getHostName failed'); halt(3); end; MyHost:=GetHostByName(@ch[1]); IF MyHost=NIL THEN BEGIN Writeln(GetHostName('+StrPas(@ch[1])+') failed : Error '+IntToStr(WSAGetLastError)); Halt(4); END ELSE BEGIN Write('address '); FOR i:=1 TO 4 DO BEGIN Write(Ord(MyHost.h_addr^[i-1])); IF i<4 THEN then write('.') ELSE writeln; END; END; end.
楼上的你们的代码也太长了吧! procedure TForm1.Button1Click(Sender: TObject); var vObj : Variant; ip : string; begin vObj := CreateOleObject('MSWinsock.Winsock'); ip := vObj.LocalIP; showmessage(ip); vobj := unassigned; end;
ASTAT =record
adapt:TADAPTERSTATUS ;
NameBuff:array[0..30] of TNameBuffer;
end;
New_byte=array[0..5] of byte;
var
NewByte:New_Byte;
procedure TfrmMain.GetNetCardAddress;
var
ncb:^TNCB;
AdapterList:^TLanaEnum;
ret:Char;
i,K:integer;
Adapter:^ASTAT;
textt:string;
// pAdd:string;
// m_byteAddressMySelf:string;
// m_ctrlThisNetCard:TStrings;
begin
// m_ctrlThisNetCard:=TStringList.Create;
getMem(ncb,sizeof(TNCB));
getMem(AdapterList,sizeof(TLanaEnum));
ncb^.ncb_command:=char(NCBENUM);
Ncb^.ncb_buffer := pchar(AdapterList);
Ncb^.ncb_length := sizeof(AdapterList);
// ret :=Netbios(PNCB(ncb));
Netbios(PNCB(ncb));
if (Ncb^.ncb_retcode<>char(NRC_GOODRET)) then exit;
For I:=0 to ord(AdapterList^.Length) do
begin
getmem(ncb,sizeof(TNCB));
Ncb^.ncb_command := char(NCBRESET);
Ncb^.ncb_lana_num := AdapterList.lana[i];
if (Netbios(PNCB(Ncb)) <> char(NRC_GOODRET)) then exit;
getmem(ncb,sizeof(TNCB));
Ncb^.ncb_command := char(NCBASTAT);
Ncb^.ncb_lana_num := AdapterList.lana[i];
ncb^.ncb_callname:='*';
getMem(Adapter,sizeof(Adapter^));
Ncb^.ncb_buffer := pchar(Adapter);
Ncb^.ncb_length := sizeof(Adapter^);
ret:=Netbios(PNCB(Ncb));
if (ret<> #0) then exit;
for K:=0 to 5 do
if(Adapter^.adapt.adapter_address[K]<>#0)then break;
if(K>=6)then continue;
textt:=format('%.02X %.02X %.02X %.02X %.02X %.02X',
[ord(Adapter^.adapt.adapter_address[0]),
ord(Adapter^.adapt.adapter_address[1]),
ord(Adapter^.adapt.adapter_address[2]),
ord(Adapter^.adapt.adapter_address[3]),
ord(Adapter^.adapt.adapter_address[4]),
ord(Adapter^.adapt.adapter_address[5])]);
if(m_ctrlThisNetCard.items.IndexOf(textt)=LB_ERR)then
m_ctrlThisNetCard.items.Add(textt);
end;
end;
function TfrmMain.HextoDec(const Hex: string): integer;
var
I:integer;
C:char;
Value:integer;
begin
value:=0;
For I:=1 to Length(Hex) do
begin
C:=Hex[I];
if(C>='A') and (C<='F')then
value:=Value*10+(ord(C)-ord('A')+10)
else
Value:=Value*10+(ord(C)-ord('0'));
end;
result:=Value;
end;
function TfrmMain.SetStringtobyte(var NewByte: New_byte;
const SourceStr: string): boolean;
var
str,tmp:string;
start,I:integer;
begin
try
For I:=0 to 5 do
NewByte[I]:=0;
tmp:=Uppercase(SourceStr+' ');
for I:=0 to 5 do
begin
start:=pos(' ',tmp);
inc(start,-1);
str:=copy(tmp,0,start);
NewByte[I]:=HextoDec(str);
tmp:=copy(tmp,start+1,length(tmp)-start);
tmp:=trimLeft(tmp);
end;
result:=True;
except
result:=False;
end;
end;
---------------------------------------------------------------
// Fetches the MAC address and prints it
static void GetMACaddress(void)
{
IP_ADAPTER_INFO AdapterInfo[16]; // Allocate information
// for up to 16 NICs
DWORD dwBufLen = sizeof(AdapterInfo); // Save memory size of buffer
DWORD dwStatus = GetAdaptersInfo( // Call GetAdapterInfo
AdapterInfo, // [out] buffer to receive data
&dwBufLen); // [in] size of receive data buffer
assert(dwStatus == ERROR_SUCCESS); // Verify return value is
// valid, no buffer overflow
PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo; // Contains pointer to
// current adapter info
do {
PrintMACaddress(pAdapterInfo->Address); // Print MAC address
pAdapterInfo = pAdapterInfo->Next; // Progress through
// linked list
}
while(pAdapterInfo); // Terminate if last adapter
}
具体函数查MSDN和PSDK
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe : PHostEnt;
pptr : PaPInAddr;
Buffer : array [0..63] of char;
I : Integer;
GInitData : TWSADATA;begin
WSAStartup($101, GInitData);
Result := '';
GetHostName(Buffer, SizeOf(Buffer));
phe :=GetHostByName(buffer);
if phe = nil then Exit;
pptr := PaPInAddr(Phe^.h_addr_list);
I := 0;
while pptr^[I] <> nil do begin
result:=StrPas(inet_ntoa(pptr^[I]^));
Inc(I);
end;
WSACleanup;
end;
========================================
program get_ip;
uses
winsock,sysutils;
VAR
ch : ARRAY[1..32] OF Char;
i : Integer;
WSData: TWSAData;
MyHost: PHostEnt;
begin
IF WSAstartup(2,wsdata)<>0 THEN
BEGIN
Writeln('can''t start Winsock: Error ',WSAGetLastError);
Halt(2);
END;
try
IF getHostName(@ch[1],32)<>0 THEN
BEGIN
Writeln('getHostName failed');
Halt(3);
END;
except
Writeln('getHostName failed');
halt(3);
end;
MyHost:=GetHostByName(@ch[1]);
IF MyHost=NIL THEN
BEGIN
Writeln(GetHostName('+StrPas(@ch[1])+') failed : Error
'+IntToStr(WSAGetLastError));
Halt(4);
END
ELSE
BEGIN
Write('address ');
FOR i:=1 TO 4 DO
BEGIN
Write(Ord(MyHost.h_addr^[i-1]));
IF i<4 THEN
then write('.')
ELSE
writeln;
END;
END;
end.
procedure TForm1.Button1Click(Sender: TObject);
var
vObj : Variant;
ip : string;
begin
vObj := CreateOleObject('MSWinsock.Winsock');
ip := vObj.LocalIP;
showmessage(ip);
vobj := unassigned;
end;
取本地IP我会的,
但是如何取得本机所有IP呢?
http://www.overbyte.be
就这么简单WSocket.LocalIPList.Text;