12

Inno Setupを使用してユーザーのローカルIPアドレスを取得するにはどうすればよいですか?

Win32 APIの使用を考えましGetIpAddrTableたが、調整方法がわかりません。

誰か他の方法はありますか?またはそれを行う方法を知っていますか?

4

2 に答える 2

22

IPv4アドレスとIPv6アドレスのどちらが必要かによって異なります。しかし、あなたが言及GetIpAddrTableし、IPv4アドレスしか返さないので、それがあなたが望んでいたものだと思います。

各マシンは、複数のローカルIPアドレスを持つことができます。だから私はそれらをとして返しますTStringList
私が以下をテストしたマシンには、5つのIPアドレスがありました。

Inno SetupはポインターをサポートしていないのでArray of Byte、バッファー用にすべてを実行する必要がありました。

以下のコードは、この関数の使用方法を示す完全な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 '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;
于 2011-05-30T02:26:56.137 に答える
8

IPアドレスのリストを返す外部DLLを構築し、InnoSetupスクリプトでそのリストを読み取ります。

この記事では、DLLを作成する方法と、InnoSetupスクリプトでDLLを呼び出す方法のコード例を紹介します。

このSO投稿では、IndyライブラリまたはプレーンWinApiを使用してIPアドレスを取得する方法を説明します。

于 2011-05-29T12:24:35.287 に答える