Подтвердить что ты не робот

Как получить локальный IP-адрес с помощью Inno-setup

Привет, ребята, как я могу получить локальный IP-адрес пользователя с помощью Inno setup? Я думал, что использовать win32 api GetIpAddrTable, но неясно, как выполнить настройку. Доза у кого-то есть другой путь? или знаете, как это сделать? танки

4b9b3361

Ответ 1

Это зависит от того, хотите ли вы IPv4-адрес или IPv6-адрес. Но поскольку вы упомянули GetIpAddrTable, и он возвращает только IPv4-адреса, я подозреваю, что это то, что вы хотели.

Каждый компьютер может иметь более одного локального IP-адреса. Поэтому я возвращаю их как TStringList Машина, на которой я тестировал следующее, имела 5 IP-адресов.

Так как InnoSetup не поддерживает указатели, мне пришлось делать все через массив байтов для буфера.

Код ниже представляет собой полный InnoSetup Script, который демонстрирует, как использовать эту функцию.

[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;

Ответ 2

Создайте внешнюю DLL, которая возвращает список IP-адресов и читает этот список в Inno Setup script.

В в этой статье вы найдете пример кода, как построить DLL и как вызвать его в InnoSetup script.

В этом сообщении SO вы найдете, как получить IP-адреса, используя библиотеку Indy или обычную WinApi.