Chrome 的 Inno Setup 自定义 URL
Inno Setup Custom URL for Chrome
我正在使用 Eclipse 和 Inno Setup 创建一个小应用程序。编译是用 Ant 做的。一切正常,我可以找到生成默认 .iss 的位置,将它放在我的 Eclipse 包中,然后可以 mod 让我的安装程序注入注册表项,使 Windows 支持我的应用程序自定义 URL.
(project/build/package/windows/myapp.iss
, 添加了 [Registry]
部分)
它在 IE 和 Edge 下有效,但不幸的是 Chrome 不适用,因为 Google 决定在自定义 URLs 时不遵循注册表...
你们中有人知道是否可以通过 Inno Setup 安装程序为 Chrome 安装自定义 URL 吗?
目前我知道我们需要 mod %localappdata%/Google/Chrome/User Data/Local State
来添加协议,但是可以通过 Inno Setup 实现吗?
Chrome的Local State
配置文件是JSON格式。
Inno Setup 本身不支持 JSON。您可以尝试使用简单的字符串操作手动破解文件。
但我建议您使用一些第 3 方库来解析 JSON,例如 TLama's Inno JSON Config library。
代码可以像下面这样。
代码add/sets这个键在JSON。我希望这就是你所追求的。
"protocol_handler": {
"excluded_schemes": {
"myprotocol": true
}
}
[Files]
Source: "JSONConfig.dll"; Flags: dontcopy
[code]
function JSONQueryBoolean(FileName, Section, Key: WideString;
Default: Boolean; var Value: Boolean): Boolean;
external 'JSONQueryBoolean@files:jsonconfig.dll stdcall';
function JSONWriteBoolean(FileName, Section, Key: WideString;
Value: Boolean): Boolean;
external 'JSONWriteBoolean@files:jsonconfig.dll stdcall';
procedure EnableChromeProtocol(Protocol: string);
var
FileName: WideString;
BoolValue: Boolean;
begin
FileName := ExpandConstant('{localappdata}') + '\Google\Chrome\User Data\Local State';
Log('Chrome local state config file: ' + FileName);
if JSONQueryBoolean(
FileName, 'protocol_handler.excluded_schemes', Protocol, False, BoolValue) then
begin
if BoolValue then
begin
Log('Protocol is enabled');
end
else
begin
Log('Protocol is disabled');
end;
end
else
begin
Log('Protocol not configured');
BoolValue := False;
end;
if not BoolValue then
begin
if JSONWriteBoolean(FileName, 'protocol_handler.excluded_schemes', Protocol, True) then
begin
Log('Protocol enabled');
end
else
begin
Log('Protocol enabling failed');
end;
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
EnableChromeProtocol('myprotocol');
end;
end;
代码需要 Inno Setup 的 Unicode 版本。
另见 Inno Setup: Working with JSON。
还有一个替代实现,JsonParser。
我正在使用 Eclipse 和 Inno Setup 创建一个小应用程序。编译是用 Ant 做的。一切正常,我可以找到生成默认 .iss 的位置,将它放在我的 Eclipse 包中,然后可以 mod 让我的安装程序注入注册表项,使 Windows 支持我的应用程序自定义 URL.
(project/build/package/windows/myapp.iss
, 添加了 [Registry]
部分)
它在 IE 和 Edge 下有效,但不幸的是 Chrome 不适用,因为 Google 决定在自定义 URLs 时不遵循注册表...
你们中有人知道是否可以通过 Inno Setup 安装程序为 Chrome 安装自定义 URL 吗?
目前我知道我们需要 mod %localappdata%/Google/Chrome/User Data/Local State
来添加协议,但是可以通过 Inno Setup 实现吗?
Chrome的Local State
配置文件是JSON格式。
Inno Setup 本身不支持 JSON。您可以尝试使用简单的字符串操作手动破解文件。
但我建议您使用一些第 3 方库来解析 JSON,例如 TLama's Inno JSON Config library。
代码可以像下面这样。
代码add/sets这个键在JSON。我希望这就是你所追求的。
"protocol_handler": {
"excluded_schemes": {
"myprotocol": true
}
}
[Files]
Source: "JSONConfig.dll"; Flags: dontcopy
[code]
function JSONQueryBoolean(FileName, Section, Key: WideString;
Default: Boolean; var Value: Boolean): Boolean;
external 'JSONQueryBoolean@files:jsonconfig.dll stdcall';
function JSONWriteBoolean(FileName, Section, Key: WideString;
Value: Boolean): Boolean;
external 'JSONWriteBoolean@files:jsonconfig.dll stdcall';
procedure EnableChromeProtocol(Protocol: string);
var
FileName: WideString;
BoolValue: Boolean;
begin
FileName := ExpandConstant('{localappdata}') + '\Google\Chrome\User Data\Local State';
Log('Chrome local state config file: ' + FileName);
if JSONQueryBoolean(
FileName, 'protocol_handler.excluded_schemes', Protocol, False, BoolValue) then
begin
if BoolValue then
begin
Log('Protocol is enabled');
end
else
begin
Log('Protocol is disabled');
end;
end
else
begin
Log('Protocol not configured');
BoolValue := False;
end;
if not BoolValue then
begin
if JSONWriteBoolean(FileName, 'protocol_handler.excluded_schemes', Protocol, True) then
begin
Log('Protocol enabled');
end
else
begin
Log('Protocol enabling failed');
end;
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
EnableChromeProtocol('myprotocol');
end;
end;
代码需要 Inno Setup 的 Unicode 版本。
另见 Inno Setup: Working with JSON。
还有一个替代实现,JsonParser。