在微软网站上有一个很好的讨论:
检测是否已经安装了合适的WebView2 Runtime
在部分中,它声明:
检查WebView2运行时的
pv
(REG_SZ
) regkey以下注册表位置。使用HKEY_LOCAL_MACHINE
regkey对于每台机器安装。HKEY_CURRENT_USER
regkey用于每个用户的安装。对于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;
我还必须将begin
和end
关键字添加到if
语句中。如果您可以看到更有效的编写此代码的方法,请随时更新或添加您自己的答案。例如,我链接到的原始文章提到了另一种选择(GetAvailableCoreWebView2BrowserVersionString
)。我想我们不能用那种方法。