检测WebView2 Runtime是否安装了Inno Setup



在微软网站上有一个很好的讨论:

检测是否已经安装了合适的WebView2 Runtime

在部分中,它声明:

检查WebView2运行时的pv(REG_SZ) regkey以下注册表位置。使用HKEY_LOCAL_MACHINEregkey对于每台机器安装。HKEY_CURRENT_USERregkey用于每个用户的安装。

对于WebView2应用程序,这些regkey必须至少有一个是使用大于0.0.0.0的版本呈现和定义。如果既不Regkey存在,或者这些Regkey中只有一个存在,但其值为null,一个空字符串,或者0.0.0.0,这意味着WebView2客户端上没有安装运行时。检查这些regkey来检测是否安装WebView2 Runtime,获取版本号WebView2运行时。在以下两个位置找到pv(REG_SZ)

在64位Windows上检查的两个注册表位置:

  • HKEY_LOCAL_MACHINESOFTWAREWOW6432NodeMicrosoftEdgeUpdateClients{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}
  • HKEY_CURRENT_USERSoftwareMicrosoftEdgeUpdateClients{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}

在32位Windows上检查的两个注册表位置:

  • HKEY_LOCAL_MACHINESOFTWAREMicrosoftEdgeUpdateClients{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}
  • HKEY_CURRENT_USERSoftwareMicrosoftEdgeUpdateClients{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}

我的安装程序使用提升,所以我限制了我的检查HKEY_LOCAL_MACHINE。我相信这样做是正确的。这是我写这个函数的尝试:

function IsWebView2RuntimeNeeded(): boolean;
var
Version: string;
RuntimeNeeded: boolean;
VerifyRuntime: boolean;
begin
{ See: https://learn.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#detect-if-a-suitable-webview2-runtime-is-already-installed }
RuntimeNeeded := true;
VerifyRuntime := false;
{ Since we are using an elevated installer I am not checking HKCU }
if (IsWin64) then
begin
{ Test x64 }
if (RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWAREWOW6432NodeMicrosoftEdgeUpdateClients{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}', 'pv', Version)) then
begin
{ We need to verify }
VerifyRuntime := true;
end
else
begin
{ Test x32 }
if (RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWAREMicrosoftEdgeUpdateClients{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}', 'pv', Version)) then
begin
{ We need to verify }
VerifyRuntime := true;
end;
end;
{ Verify the version information }
if (VerifyRuntime) then
begin
if (not Version = '' and not Version = '0.0.0.0') then
Log('WebView2 Runtime is installed');
RuntimeNeeded := false;
else
Log('WebView2 Runtime needs to be downloaded and installed');
end;
end;
Result := RuntimeNeeded;
end;

但是它不会编译并且说:

列40类型不匹配。

它不像这一行:

if (not Version = '' and not Version = '0.0.0.0') then

我没有信心编写本地Pascal脚本,所以我感谢纠正或改进此代码的指导,以便它有效地工作。


我对实际下载文件并启动其安装程序的其他方面感到满意,因为我可以遵循安装脚本中其他下载的原则。它只是把这个实际的测试放在一起来验证是否安装了WebView2运行时。

我从另一个网站上对这个问题的评论中收集了一些建议:

如何编写if and语句?


我现在的代码是:

function IsWebView2RuntimeNeeded(): boolean;
var
Version: string;
RuntimeNeeded: boolean;
VerifyRuntime: boolean;
begin
{ See: https://learn.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#detect-if-a-suitable-webview2-runtime-is-already-installed }
RuntimeNeeded := true;
VerifyRuntime := false;
{ Since we are using an elevated installer I am not checking HKCU }
if (IsWin64) then
begin
{ Test x64 }
if (RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWAREWOW6432NodeMicrosoftEdgeUpdateClients{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}', 'pv', Version)) then
begin
{ We need to verify }
VerifyRuntime := true;
end
else
begin
{ Test x32 }
if (RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWAREMicrosoftEdgeUpdateClients{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}', 'pv', Version)) then
begin
{ We need to verify }
VerifyRuntime := true;
end;
end;
{ Verify the version information }
if (VerifyRuntime) then
begin
if (Version <> '') and (Version <> '0.0.0.0') then
begin
Log('WebView2 Runtime is installed');
RuntimeNeeded := false;
end
else
Log('WebView2 Runtime needs to be downloaded and installed');
end;
end;
Result := RuntimeNeeded;
end;

我还必须将beginend关键字添加到if语句中。如果您可以看到更有效的编写此代码的方法,请随时更新或添加您自己的答案。例如,我链接到的原始文章提到了另一种选择(GetAvailableCoreWebView2BrowserVersionString)。我想我们不能用那种方法。

相关内容

  • 没有找到相关文章

最新更新