GetComputerName:取得 NetBIOS 電腦名稱。WSAStartup/WSACleanup:初始化/清理 Winsock。gethostbyname:依主機名稱解析 IP 位址 (IPv4)。unit uGetHostInfo;
interface
uses Winsock, SysUtils;
function GetLocalComputerName: string;
function GetLocalIPAddress: string;
implementation
function GetLocalComputerName: string;
var
Buffer: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char;
Size: DWORD;
begin
Result := '';
Size := Length(Buffer);
if GetComputerName(Buffer, Size) then
Result := StrPas(Buffer);
end;
function GetLocalIPAddress: string;
var
WSAData: TWSAData;
HostEnt: PHostEnt;
Name: string;
begin
Result := '';
if WSAStartup($0202, WSAData) <> 0 then Exit;
try
Name := GetLocalComputerName;
if Name = '' then Exit;
HostEnt := gethostbyname(PAnsiChar(AnsiString(Name)));
if HostEnt <> nil then
with HostEnt^ do
Result := Format('%d.%d.%d.%d',
[Byte(h_addr_list^[0]^), Byte(h_addr_list^[1]^),
Byte(h_addr_list^[2]^), Byte(h_addr_list^[3]^)]);
finally
WSACleanup;
end;
end;
end.
procedure TForm1.btnGetInfoClick(Sender: TObject);
begin
edtName.Text := GetLocalComputerName;
edtIP.Text := GetLocalIPAddress;
end;
gethostbyname 僅回傳第一個 IPv4 位址。若需列舉所有網卡 IP (含 IPv6),請使用 GetAdaptersAddresses (IP Helper API) 或 Indy 的 TIdStack.LocalAddresses。
uses IdStack, SysUtils;
procedure TForm1.btnIndyClick(Sender: TObject);
var
List: TIdStackLocalAddressList;
Addr: string;
begin
List := TIdStackLocalAddressList.Create;
try
GStack.GetLocalAddressList(List);
for Addr in List do
Memo1.Lines.Add(Addr);
finally
List.Free;
end;
end;