mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-04 03:29:03 +08:00
[v2, windows] Load WebView2 loader from embedded only (#1432)
This commit is contained in:
parent
f292e221f1
commit
614f50d5d3
@ -10,11 +10,6 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
nativeModule = windows.NewLazyDLL("WebView2Loader")
|
|
||||||
nativeCreate = nativeModule.NewProc("CreateCoreWebView2EnvironmentWithOptions")
|
|
||||||
nativeCompareBrowserVersions = nativeModule.NewProc("CompareBrowserVersions")
|
|
||||||
nativeGetAvailableCoreWebView2BrowserVersionString = nativeModule.NewProc("GetAvailableCoreWebView2BrowserVersionString")
|
|
||||||
|
|
||||||
memOnce sync.Once
|
memOnce sync.Once
|
||||||
memModule winloader.Module
|
memModule winloader.Module
|
||||||
memCreate winloader.Proc
|
memCreate winloader.Proc
|
||||||
@ -23,6 +18,11 @@ var (
|
|||||||
memErr error
|
memErr error
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// https://referencesource.microsoft.com/#system.web/Util/hresults.cs,20
|
||||||
|
E_FILENOTFOUND = 0x80070002
|
||||||
|
)
|
||||||
|
|
||||||
// CompareBrowserVersions will compare the 2 given versions and return:
|
// CompareBrowserVersions will compare the 2 given versions and return:
|
||||||
// -1 = v1 < v2
|
// -1 = v1 < v2
|
||||||
// 0 = v1 == v2
|
// 0 = v1 == v2
|
||||||
@ -38,26 +38,17 @@ func CompareBrowserVersions(v1 string, v2 string) (int, error) {
|
|||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
nativeErr := nativeModule.Load()
|
err = loadFromMemory()
|
||||||
if nativeErr == nil {
|
|
||||||
nativeErr = nativeCompareBrowserVersions.Find()
|
|
||||||
}
|
|
||||||
var result int
|
|
||||||
if nativeErr != nil {
|
|
||||||
err := loadFromMemory(nativeErr)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("Unable to load WebView2Loader.dll from disk: %v -- or from memory: %w", nativeErr, memErr)
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var result int
|
||||||
_, _, err = memCompareBrowserVersions.Call(
|
_, _, err = memCompareBrowserVersions.Call(
|
||||||
uint64(uintptr(unsafe.Pointer(_v1))),
|
uint64(uintptr(unsafe.Pointer(_v1))),
|
||||||
uint64(uintptr(unsafe.Pointer(_v2))),
|
uint64(uintptr(unsafe.Pointer(_v2))),
|
||||||
uint64(uintptr(unsafe.Pointer(&result))))
|
uint64(uintptr(unsafe.Pointer(&result))))
|
||||||
} else {
|
|
||||||
_, _, err = nativeCompareBrowserVersions.Call(
|
|
||||||
uintptr(unsafe.Pointer(_v1)),
|
|
||||||
uintptr(unsafe.Pointer(_v2)),
|
|
||||||
uintptr(unsafe.Pointer(&result)))
|
|
||||||
}
|
|
||||||
if err != windows.ERROR_SUCCESS {
|
if err != windows.ERROR_SUCCESS {
|
||||||
return result, err
|
return result, err
|
||||||
}
|
}
|
||||||
@ -67,28 +58,25 @@ func CompareBrowserVersions(v1 string, v2 string) (int, error) {
|
|||||||
// GetInstalledVersion returns the installed version of the webview2 runtime.
|
// GetInstalledVersion returns the installed version of the webview2 runtime.
|
||||||
// If there is no version installed, a blank string is returned.
|
// If there is no version installed, a blank string is returned.
|
||||||
func GetInstalledVersion() (string, error) {
|
func GetInstalledVersion() (string, error) {
|
||||||
nativeErr := nativeModule.Load()
|
err := loadFromMemory()
|
||||||
if nativeErr == nil {
|
|
||||||
nativeErr = nativeGetAvailableCoreWebView2BrowserVersionString.Find()
|
|
||||||
}
|
|
||||||
var err error
|
|
||||||
var result *uint16
|
|
||||||
if nativeErr != nil {
|
|
||||||
err := loadFromMemory(nativeErr)
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("Unable to load WebView2Loader.dll from disk: %v -- or from memory: %w", nativeErr, memErr)
|
|
||||||
}
|
|
||||||
_, _, err = memGetAvailableCoreWebView2BrowserVersionString.Call(
|
|
||||||
uint64(uintptr(unsafe.Pointer(nil))),
|
|
||||||
uint64(uintptr(unsafe.Pointer(&result))))
|
|
||||||
} else {
|
|
||||||
_, _, err = nativeCompareBrowserVersions.Call(
|
|
||||||
uintptr(unsafe.Pointer(nil)),
|
|
||||||
uintptr(unsafe.Pointer(&result)))
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var result *uint16
|
||||||
|
res, _, err := memGetAvailableCoreWebView2BrowserVersionString.Call(
|
||||||
|
uint64(uintptr(unsafe.Pointer(nil))),
|
||||||
|
uint64(uintptr(unsafe.Pointer(&result))))
|
||||||
|
|
||||||
|
if res != 0 {
|
||||||
|
if res == E_FILENOTFOUND {
|
||||||
|
// Webview2 is not installed
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", fmt.Errorf("Unable to call GetAvailableCoreWebView2BrowserVersionString (%x): %w", res, err)
|
||||||
|
}
|
||||||
|
|
||||||
version := windows.UTF16PtrToString(result)
|
version := windows.UTF16PtrToString(result)
|
||||||
windows.CoTaskMemFree(unsafe.Pointer(result))
|
windows.CoTaskMemFree(unsafe.Pointer(result))
|
||||||
return version, nil
|
return version, nil
|
||||||
@ -97,12 +85,7 @@ func GetInstalledVersion() (string, error) {
|
|||||||
// CreateCoreWebView2EnvironmentWithOptions tries to load WebviewLoader2 and
|
// CreateCoreWebView2EnvironmentWithOptions tries to load WebviewLoader2 and
|
||||||
// call the CreateCoreWebView2EnvironmentWithOptions routine.
|
// call the CreateCoreWebView2EnvironmentWithOptions routine.
|
||||||
func CreateCoreWebView2EnvironmentWithOptions(browserExecutableFolder, userDataFolder *uint16, environmentOptions uintptr, environmentCompletedHandle uintptr) (uintptr, error) {
|
func CreateCoreWebView2EnvironmentWithOptions(browserExecutableFolder, userDataFolder *uint16, environmentOptions uintptr, environmentCompletedHandle uintptr) (uintptr, error) {
|
||||||
nativeErr := nativeModule.Load()
|
err := loadFromMemory()
|
||||||
if nativeErr == nil {
|
|
||||||
nativeErr = nativeCreate.Find()
|
|
||||||
}
|
|
||||||
if nativeErr != nil {
|
|
||||||
err := loadFromMemory(nativeErr)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
@ -114,22 +97,14 @@ func CreateCoreWebView2EnvironmentWithOptions(browserExecutableFolder, userDataF
|
|||||||
)
|
)
|
||||||
return uintptr(res), nil
|
return uintptr(res), nil
|
||||||
}
|
}
|
||||||
res, _, _ := nativeCreate.Call(
|
|
||||||
uintptr(unsafe.Pointer(browserExecutableFolder)),
|
|
||||||
uintptr(unsafe.Pointer(userDataFolder)),
|
|
||||||
environmentOptions,
|
|
||||||
environmentCompletedHandle,
|
|
||||||
)
|
|
||||||
return res, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func loadFromMemory(nativeErr error) error {
|
func loadFromMemory() error {
|
||||||
var err error
|
var err error
|
||||||
// DLL is not available natively. Try loading embedded copy.
|
// DLL is not available natively. Try loading embedded copy.
|
||||||
memOnce.Do(func() {
|
memOnce.Do(func() {
|
||||||
memModule, memErr = winloader.LoadFromMemory(WebView2Loader)
|
memModule, memErr = winloader.LoadFromMemory(WebView2Loader)
|
||||||
if memErr != nil {
|
if memErr != nil {
|
||||||
err = fmt.Errorf("Unable to load WebView2Loader.dll from disk: %v -- or from memory: %w", nativeErr, memErr)
|
err = fmt.Errorf("Unable to load WebView2Loader.dll from memory: %w", memErr)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
memCreate = memModule.Proc("CreateCoreWebView2EnvironmentWithOptions")
|
memCreate = memModule.Proc("CreateCoreWebView2EnvironmentWithOptions")
|
||||||
|
Loading…
Reference in New Issue
Block a user