返回 DeepSeek-Reasonix
find_dll_installed.go
根目录 / desktop / third_party / go-webview2 / webviewloader / find_dll_installed.go
1 //go:build windows && !native_webview2loader
2
3 package webviewloader
4
5 import (
6 "path/filepath"
7
8 "golang.org/x/sys/windows/registry"
9 )
10
11 const (
12 kNumChannels = 4
13 kInstallKeyPath = "Software\\Microsoft\\EdgeUpdate\\ClientState\\"
14 kMinimumCompatibleVersion = "86.0.616.0"
15 )
16
17 var (
18 kChannelName = [kNumChannels]string{
19 "", "beta", "dev", "canary", // "internal"
20 }
21
22 kChannelUuid = [kNumChannels]string{
23 "{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}",
24 "{2CD8A007-E189-409D-A2C8-9AF4EF3C72AA}",
25 "{0D50BFEC-CD6A-4F9A-964C-C7416E3ACB10}",
26 "{65C35B14-6C1D-4122-AC46-7148CC9D6497}",
27 //"{BE59E8FD-089A-411B-A3B0-051D9E417818}",
28 }
29
30 minimumCompatibleVersion, _ = parseVersion(kMinimumCompatibleVersion)
31 )
32
33 func findInstalledClientDll(preferCanary bool) (clientPath string, version *version, err error) {
34 for i := 0; i < kNumChannels; i++ {
35 channel := i
36 if preferCanary {
37 channel = (kNumChannels - 1) - i
38 }
39
40 key := kInstallKeyPath + kChannelUuid[channel]
41 for _, checkSystem := range []bool{true, false} {
42 clientPath, version, err := findInstalledClientDllForChannel(key, checkSystem)
43 if err == errNoClientDLLFound {
44 continue
45 }
46 if err != nil {
47 return "", nil, err
48 }
49
50 version.channel = kChannelName[channel]
51 return clientPath, version, nil
52 }
53 }
54 return "", nil, errNoClientDLLFound
55 }
56
57 func findInstalledClientDllForChannel(subKey string, system bool) (clientPath string, clientVersion *version, err error) {
58 key := registry.LOCAL_MACHINE
59 if !system {
60 key = registry.CURRENT_USER
61 }
62
63 regKey, err := registry.OpenKey(key, subKey, registry.READ|registry.WOW64_32KEY)
64 if err != nil {
65 return "", nil, mapFindErr(err)
66 }
67 defer regKey.Close()
68
69 embeddedEdgeSubFolder, _, err := regKey.GetStringValue("EBWebView")
70 if err != nil {
71 return "", nil, mapFindErr(err)
72 }
73
74 if embeddedEdgeSubFolder == "" {
75 return "", nil, errNoClientDLLFound
76 }
77
78 versionString := filepath.Base(embeddedEdgeSubFolder)
79 version, err := parseVersion(versionString)
80 if err != nil {
81 return "", nil, errNoClientDLLFound
82 }
83
84 if version.compare(minimumCompatibleVersion) < 0 {
85 return "", nil, errNoClientDLLFound
86 }
87
88 dllPath, err := findEmbeddedClientDll(embeddedEdgeSubFolder)
89 if err != nil {
90 return "", nil, mapFindErr(err)
91 }
92
93 return dllPath, &version, nil
94 }
95
95 lines GO