Inno Setup 中基于国家/地区的下载

Country based download in Inno Setup

我正在尝试为我的软件使用 Inno Setup。目前,我的软件每天从不同的地理区域获得超过 6000 次下载。问题是我的软件对每个地理区域的表现不同,所以我为每个地理区域创建了不同的 exe。目前正在使用 Inno Setup 作为我的软件的下载管理器。现在如何找到用户来自哪个地理区域以及如何告诉我的 Inno Setup 脚本下载 exe,用户来自哪里。

目前我拥有的是:

#define MyAppName ""
#define MyAppVersion "1"
#define _URL ""
#define _exeFileName "setup.exe"
#include ReadReg(HKEY_LOCAL_MACHINE,'Software\Sherlock Software\InnoTools\Downloader','ScriptPath','');
[Setup]
AppId={{7B0D8E4E-BAFD-400B-B775-0DD7D8FBAE08}
AppName={#MyAppName}
AppVersion={#MyAppVersion};
AppVerName={#MyAppName} {#MyAppVersion}
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
DisableFinishedPage=yes
OutputBaseFilename={#MyAppName}{#MyAppVersion}
Compression=lzma
SolidCompression=yes
DisableWelcomePage=yes
DisableReadyPage=yes
DisableReadyMemo=True
Uninstallable=no
RestartIfNeededByRun=no                     
CreateAppDir=False
UsePreviousGroup=False

如果有人能帮我解决这个问题就太好了。

提前致谢

我不知道解析位置的最佳方法是什么。这是一个单独的问题。

但是你可以使用一些在线服务。

例如https://ipinfo.io/country

它returns 一个两位数的 ICO 国家代码。

您可以使用WinHttpRequest阅读代码。参见 How to read a text file from the Internet resource?


以下示例展示了如何将其与 Inno 下载插件结合使用:

var
  Country: string;

function GetCountry: string;
var
  WinHttpReq: Variant;
begin
  if Country <> '' then
  begin
    Log(Format('Using cached country: %s', [Country]));
    Result := Country;
  end
    else
  begin
    try
      WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1');
      WinHttpReq.Open('GET', 'https://ipinfo.io/country', False);
      WinHttpReq.Send;
      Result := Trim(WinHttpReq.ResponseText);
    except
      Log(GetExceptionMessage);
      Result := 'XX';
    end;

    Country := Result;
    Log(Format('Resolved country: %s', [Country]));
  end;
end;

function InitializeSetup(): Boolean;
begin
  idpAddFile(
    'https://example.com/file-for-' + GetCountry + '.exe',
    ExpandConstant('{tmp}\file.exe'));
end;

顺便说一句,您是否考虑过在下载时解决您网站上的地理位置问题?并让用户直接下载特定于 his/her 位置的安装程序?