delphi - Cómo obtener la dirección IP local usando Inno-setup
winapi pascal (2)
Cree una DLL externa que devuelva una lista de direcciones IP y lea esa lista en la secuencia de comandos Inno Setup.
En este artículo encontrará ejemplos de código sobre cómo crear una DLL y cómo llamarla en la secuencia de comandos InnoSetup.
En esta publicación SO encontrará cómo obtener direcciones IP utilizando la biblioteca Indy o WinApi simple.
Hola chicos
¿Cómo puedo obtener la dirección IP local del usuario usando la configuración de Inno? Pensé en utilizar GetIpAddrTable de api win32, pero no está claro cómo hacer el ajuste. ¿Alguien tiene alguna otra forma? o sabes cómo hacerlo? tanques
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 TStringList. La máquina que probé a continuación tenía 5 direcciones IP.
Como InnoSetup no es compatible con los punteros, tuve que hacer todo a través de una matriz de bytes para el búfer.
El siguiente código es un script InnoSetup completo 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;