如何使用 Inno Setup 获取用户的本地 IP 地址?
我考虑过使用 Win32 API GetIpAddrTable
,但不清楚如何进行调整。
有人有其他方法吗?或者知道怎么做?
如何使用 Inno Setup 获取用户的本地 IP 地址?
我考虑过使用 Win32 API GetIpAddrTable
,但不清楚如何进行调整。
有人有其他方法吗?或者知道怎么做?
这取决于您想要 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;