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
如果有人能帮我解决这个问题就太好了。
提前致谢
我不知道解析位置的最佳方法是什么。这是一个单独的问题。
但是你可以使用一些在线服务。
它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 位置的安装程序?
我正在尝试为我的软件使用 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
如果有人能帮我解决这个问题就太好了。
提前致谢
我不知道解析位置的最佳方法是什么。这是一个单独的问题。
但是你可以使用一些在线服务。
它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 位置的安装程序?