【问题标题】:How to get the local IP address using Inno Setup如何使用 Inno Setup 获取本地 IP 地址
【发布时间】:2011-05-29 09:23:04
【问题描述】:

如何使用 Inno Setup 获取用户的本地 IP 地址?

我想过使用Win32 API GetIpAddrTable,但不清楚如何进行调整。

有人有其他方法吗?或者知道怎么做?

【问题讨论】:

  • 使用inno setup是什么意思?
  • @opc0de:他可能正在编写 Inno Setup 脚本。 Inno Setup 支持 Pascal 脚本。
  • 我可以建议将这样的功能放在安装程序中是浪费时间。相反,之后启动一个 UI,让用户配置该实用程序。稍后,用户将希望再次运行相同的选项。您希望他们重新安装以更改此选项吗?安装后用户IP发生变化怎么办?
  • 这取决于您想要 IPv4 地址还是 IPv6 地址。此外,一台机器可以有多个本地 IP 地址。
  • @Toda,如果我在我住的酒店连接到 WiFi 网络时安装你的软件,然后回家尝试使用我在那里的有线网络上的软件,会发生什么?提示:IP 肯定会改变,不要在安装时询问 IP 地址。适配器信息也可能不够(如果我配置 VPN 或插入 USB WiFi 加密狗,或使用手机的 BT 连接会怎样)。如果您的应用程序严重依赖网络设备和地址,那么它是为“高级用户”设计的,他们肯定会要求能够在运行时选择 IP 或适配器。

标签: delphi winapi inno-setup pascalscript


【解决方案1】:

这取决于您想要 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;

【讨论】:

  • 是的,+1 也是如此,但我个人仍会尽可能将所有实用程序代码移到脚本之外(并移到辅助 DLL 中)。安装程序脚本不能很好地扩展,为了可读性/可维护性,保持它们的意思和精简。
  • 我会将这些例程放在 ISPP #include 语句中以保持干净。
  • 为什么我会收到错误 Unknown type 'WordBool' with this code?​​span>
  • @hram908 你用的是什么版本的 InnoSetup?
  • Inno Setup 5 ( 5.5.4 ) & ISTool 5.3.0.1
【解决方案2】:

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

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

In this SO post 你会发现如何使用 Indy 库或普通 WinApi 获取 IP 地址。

【讨论】:

  • 无需创建外部DLL,InnoSetup可以直接调用API
猜你喜欢
  • 1970-01-01
  • 2021-01-28
  • 2011-02-10
  • 2011-10-11
  • 1970-01-01
  • 2023-04-08
  • 2011-03-17
  • 1970-01-01
  • 2014-06-26
相关资源
最近更新 更多