2011-05-29 16 views
11

Hola chicos
¿cómo puedo obtener la dirección IP local del usuario usando la configuración Inno? Pensé en utilizar Win32 api GetIpAddrTable, pero no está claro cómo hacer el ajuste. ¿Alguien tiene alguna otra forma? o sabes cómo hacerlo? tanquesCómo obtener la dirección IP local usando Inno-setup

+0

¿Qué quiere decir con el uso de la configuración inno? – opc0de

+1

@ opc0de: Probablemente esté escribiendo un script de instalación de Inno. Inno Setup es compatible con el script de Pascal. –

+0

En el proceso de instalación necesito mostrarle al usuario una lista de la dirección IP ** local ** (en caso de que tenga más de una tarjeta de red física o lógica) y dejar que el usuario seleccione de una lista de direcciones IP . –

Respuesta

18

Depende de si desea la dirección IPv4 o la dirección IPv6. Pero como mencionaste GetIpAddrTable y solo devuelve direcciones IPv4, sospecho que eso es lo que querías.

Cada máquina puede tener más de una dirección IP local. Así que los devuelvo como un TStringList La máquina en la que probé lo siguiente tenía 5 direcciones IP.

Dado que InnoSetup no es compatible con los punteros, tuve que hacer todo lo posible a través de una matriz de bytes para el búfer.

El siguiente código es una secuencia de comandos InnoSetup completa que demuestra cómo usar esta función.

[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 para las importaciones directas de API en innosetup. –

+0

Sí, +1 también, pero personalmente movería todo el código de utilidad fuera de la secuencia de comandos (y en una DLL auxiliar) tanto como sea posible. Los scripts de instalador no se escalan demasiado bien, los mantienen medios y ajustados para la legibilidad/mantenibilidad. –

+0

Colocaría estas rutinas en una declaración ISPP '# include' para mantener las cosas limpias. –

8

Cree una DLL externa que devuelva una lista de direcciones IP y lea esa lista en la secuencia de comandos Inno Setup.

En this article encontrará ejemplos de código sobre cómo crear una DLL y cómo llamarla en la secuencia de comandos InnoSetup.

In this SO post encontrará cómo obtener direcciones IP usando la biblioteca Indy o WinApi simple.

+2

No es necesario crear una DLL externa, InnoSetup puede llamar directamente a la API –

Cuestiones relacionadas