如何使用Inno-setup获取本地IP地址

Tod*_*aba 12 delphi winapi inno-setup pascalscript

大家好
我怎样才能使用Inno设置获取用户的本地IP地址?我认为使用win32 api GetIpAddrTable,但目前还不清楚如何进行调整.有人有其他任何方式吗?或者知道怎么做?坦克

Rob*_*ove 21

这取决于您是否需要IPv4地址或IPv6地址.但是既然你提到了GetIpAddrTable,它只返回IPv4地址,我怀疑这就是你想要的.

每台计算机可以有多个本地IP地址.所以我将它们作为TStringList返回我测试以下的机器有5个IP地址.

由于InnoSetup不支持指针,我必须通过字节数组为缓冲区做所有事情.

下面的代码是一个完整的InnoSetup脚本,演示了如何使用此功能.

[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;
Run Code Online (Sandbox Code Playgroud)


and*_*ius 8

构建一个返回IP地址列表的外部DLL,并在Inno Setup脚本中读取该列表.

本文中,您将找到如何构建DLL以及如何在InnoSetup脚本中调用它的代码示例.

在这篇SO帖子中,您将找到如何使用Indy库或普通WinApi获取IP地址.

  • 无需创建外部DLL,InnoSetup可以直接调用API (2认同)