75 lines
1.4 KiB
Go
75 lines
1.4 KiB
Go
//go:build windows
|
|
|
|
package webviewloader
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
|
|
"golang.org/x/sys/windows/registry"
|
|
)
|
|
|
|
var (
|
|
errNoClientDLLFound = errors.New("no webview2 found")
|
|
)
|
|
|
|
func findEmbeddedBrowserVersion(filename string) (string, error) {
|
|
block, err := getFileVersionInfo(filename)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
info, err := verQueryValueString(block, "\\StringFileInfo\\040904B0\\ProductVersion")
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return info, nil
|
|
}
|
|
|
|
func findEmbeddedClientDll(embeddedEdgeSubFolder string) (outClientPath string, err error) {
|
|
if !filepath.IsAbs(embeddedEdgeSubFolder) {
|
|
exe, err := os.Executable()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
embeddedEdgeSubFolder = filepath.Join(filepath.Dir(exe), embeddedEdgeSubFolder)
|
|
}
|
|
|
|
return findClientDllInFolder(embeddedEdgeSubFolder)
|
|
}
|
|
|
|
func findClientDllInFolder(folder string) (string, error) {
|
|
arch := ""
|
|
switch runtime.GOARCH {
|
|
case "arm64":
|
|
arch = "arm64"
|
|
case "amd64":
|
|
arch = "x64"
|
|
case "386":
|
|
arch = "x86"
|
|
default:
|
|
return "", fmt.Errorf("Unsupported architecture")
|
|
}
|
|
|
|
dllPath := filepath.Join(folder, "EBWebView", arch, "EmbeddedBrowserWebView.dll")
|
|
if _, err := os.Stat(dllPath); err != nil {
|
|
return "", mapFindErr(err)
|
|
}
|
|
return dllPath, nil
|
|
}
|
|
|
|
func mapFindErr(err error) error {
|
|
if errors.Is(err, registry.ErrNotExist) {
|
|
return errNoClientDLLFound
|
|
}
|
|
if errors.Is(err, os.ErrNotExist) {
|
|
return errNoClientDLLFound
|
|
}
|
|
return err
|
|
}
|