Hi guys
how can I get user's local ip address using Inno setup?
I thought abut using win32 api GetIpAddrTable but it is unclear how to make the adjustment.
Dose someone have any other way? or know how to do it?
tanks
问题:
回答1:
It depends on if you want IPv4 address or the IPv6 address. But since you mentioned GetIpAddrTable and it only returns IPv4 addresses I suspect that is what you wanted.
Each machine can have more than one local IP Address. So I return them as a TStringList The machine I tested the following on had 5 IP Addresses.
Since InnoSetup does not support Pointers I had to do everything through an Array of Byte for the buffer.
The code below is a complete InnoSetup Script that demonstrates how to use this function.
[Setup]
AppName=Test
AppVersion=1.5
DefaultDirName={pf}\test
[Code]
const
ERROR_INSUFFICIENT_BUFFER = 122;
function GetIpAddrTable( pIpAddrTable: Array of Byte;
var pdwSize: Cardinal; bOrder: WordBool ): DWORD;
external 'GetIpAddrTable@IpHlpApi.dll stdcall';
procedure GetIpAddresses(Addresses : TStringList);
var
Size : Cardinal;
Buffer : Array of Byte;
IpAddr : String;
AddrCount : Integer;
I, J : Integer;
begin
// Find Size
if GetIpAddrTable(Buffer,Size,False) = ERROR_INSUFFICIENT_BUFFER then
begin
// Allocate Buffer with large enough size
SetLength(Buffer,Size);
// Get List of IP Addresses into Buffer
if GetIpAddrTable(Buffer,Size,True) = 0 then
begin
// Find out how many addresses will be returned.
AddrCount := (Buffer[1] * 256) + Buffer[0];
// Loop through addresses.
For I := 0 to AddrCount -1 do
begin
IpAddr := '';
// Loop through each byte of the address
For J := 0 to 3 do
begin
if J > 0 then
IpAddr := IpAddr + '.';
// Navigagte through record structure to find correct byte of Addr
IpAddr := IpAddr + IntToStr(Buffer[I*24+J+4]);
end;
Addresses.Add(IpAddr);
end;
end;
end;
end;
function InitializeSetup(): Boolean;
var
SL : TStringList;
begin
SL := TStringList.Create;
GetIpAddresses(SL);
MsgBox(SL.Text, mbInformation, MB_OK);
SL.Free;
end;
回答2:
Build an external DLL that returns a list of IP addresses and read that list in Inno Setup script.
In this article you will find code example how to build a DLL and how to call it in the InnoSetup script.
In this SO post you will find how to get IP addresses using Indy library or plain WinApi.