2011-05-29 83 views
11

嗨,大家好
如何使用Inno安裝程序獲取用戶的本地IP地址? 我認爲使用win32 api GetIpAddrTable緊靠,但不清楚如何進行調整。 劑量有其他方式嗎?或知道如何做到這一點? 坦克如何使用Inno-setup獲得本地IP地址

+0

你用什麼意思使用inno設置? – opc0de 2011-05-29 09:33:02

+1

@ opc0de:他可能正在編寫一個Inno Setup腳本。 Inno Setup支持Pascal腳本。 – 2011-05-29 09:38:30

+0

在安裝過程中,我需要向用戶顯示**本地** IP地址列表(如果他有多個網卡物理或邏輯),並讓用戶從列表中選擇是IP地址。 – 2011-05-29 10:09:10

回答

18

這取決於您是否需要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 '[email protected] 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; 
+0

+1來直接在innosetup中導入API。 – 2011-05-30 05:11:10

+0

是的,也是+1,但我個人仍然儘可能地將所有實用程序代碼移到腳本之外(並轉換爲助手DLL)。安裝程序腳本不能很好地縮放,保持它們的意思並精簡可讀性/可維護性。 – 2011-05-31 07:32:33

+0

我會將這些例程放在一個ISPP'#include'語句中以保持乾淨。 – 2011-05-31 13:11:49

8

構建一個外部DLL,它返回一個IP地址列表並在Inno Setup腳本中讀取該列表。

this article中,您將找到代碼示例如何構建DLL以及如何在InnoSetup腳本中調用它。

In this SO post你會發現如何使用Indy庫或純WinApi獲取IP地址。

+2

不需要創建外部DLL,InnoSetup可以直接調用API – 2011-05-30 02:26:49