如何使用Inno Setup获取用户本地IP地址?
我考虑使用Win32 API GetIpAddrTable
,但不清楚如何进行调整。
是否有其他方式可以获取IP地址?或者知道如何操作?
如何使用Inno Setup获取用户本地IP地址?
我考虑使用Win32 API GetIpAddrTable
,但不清楚如何进行调整。
是否有其他方式可以获取IP地址?或者知道如何操作?
这取决于您是想获取IPv4地址还是IPv6地址。但是由于您提到了 GetIpAddrTable
,而它只返回IPv4地址,所以我猜测这就是您想要的。
每台计算机可以拥有多个本地IP地址。因此我将它们作为 TStringList
返回。
我在以下测试的计算机上有5个IP地址。
由于Inno Setup不支持指针,所以我必须通过一个Array of Byte
缓冲区完成所有操作。
下面的代码是一个完整的Inno Setup脚本,演示如何使用此函数。
[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 + '.';
{ Navigate 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;