5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-02 23:20:51 +08:00

V2 bugfix/windows syscall go 1.23 (#3707)

* Initial test

* Fix calls

* Update changelog.mdx

* Free allocated strings

* Misc fixes
This commit is contained in:
Lea Anthony 2024-08-28 19:24:59 +10:00 committed by GitHub
parent 8e810d59f0
commit 475534c132
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 78 additions and 65 deletions

8
.replit Normal file
View File

@ -0,0 +1,8 @@
modules = ["go-1.21", "web", "nodejs-20"]
run = "go run v2/cmd/wails/main.go"
[nix]
channel = "stable-24_05"
[deployment]
run = ["sh", "-c", "go run v2/cmd/wails/main.go"]

View File

@ -2,6 +2,8 @@
package cfd package cfd
import "fmt"
type FileFilter struct { type FileFilter struct {
// The display name of the filter (That is shown to the user) // The display name of the filter (That is shown to the user)
DisplayName string DisplayName string
@ -102,6 +104,10 @@ func (config *DialogConfig) apply(dialog Dialog) (err error) {
} }
if config.SelectedFileFilterIndex != 0 { if config.SelectedFileFilterIndex != 0 {
if config.SelectedFileFilterIndex > uint(len(fileFilters)) {
err = fmt.Errorf("selected file filter index out of range")
return
}
err = dialog.SetSelectedFileFilterIndex(config.SelectedFileFilterIndex) err = dialog.SetSelectedFileFilterIndex(config.SelectedFileFilterIndex)
if err != nil { if err != nil {
return return

View File

@ -30,6 +30,10 @@ type iShellItemVtbl struct {
func newIShellItem(path string) (*iShellItem, error) { func newIShellItem(path string) (*iShellItem, error) {
var shellItem *iShellItem var shellItem *iShellItem
pathPtr := ole.SysAllocString(path) pathPtr := ole.SysAllocString(path)
defer func(v *int16) {
_ = ole.SysFreeString(v)
}(pathPtr)
ret, _, _ := procSHCreateItemFromParsingName.Call( ret, _, _ := procSHCreateItemFromParsingName.Call(
uintptr(unsafe.Pointer(pathPtr)), uintptr(unsafe.Pointer(pathPtr)),
0, 0,
@ -40,10 +44,9 @@ func newIShellItem(path string) (*iShellItem, error) {
func (vtbl *iShellItemVtbl) getDisplayName(objPtr unsafe.Pointer) (string, error) { func (vtbl *iShellItemVtbl) getDisplayName(objPtr unsafe.Pointer) (string, error) {
var ptr *uint16 var ptr *uint16
ret, _, _ := syscall.Syscall(vtbl.GetDisplayName, ret, _, _ := syscall.SyscallN(vtbl.GetDisplayName,
2,
uintptr(objPtr), uintptr(objPtr),
0x80058000, // SIGDN_FILESYSPATH 0x80058000, // SIGDN_FILESYSPATH,
uintptr(unsafe.Pointer(&ptr))) uintptr(unsafe.Pointer(&ptr)))
if err := hresultToError(ret); err != nil { if err := hresultToError(ret); err != nil {
return "", err return "", err

View File

@ -38,11 +38,9 @@ type iShellItemArrayVtbl struct {
func (vtbl *iShellItemArrayVtbl) getCount(objPtr unsafe.Pointer) (uintptr, error) { func (vtbl *iShellItemArrayVtbl) getCount(objPtr unsafe.Pointer) (uintptr, error) {
var count uintptr var count uintptr
ret, _, _ := syscall.Syscall(vtbl.GetCount, ret, _, _ := syscall.SyscallN(vtbl.GetCount,
1,
uintptr(objPtr), uintptr(objPtr),
uintptr(unsafe.Pointer(&count)), uintptr(unsafe.Pointer(&count)))
0)
if err := hresultToError(ret); err != nil { if err := hresultToError(ret); err != nil {
return 0, err return 0, err
} }
@ -51,8 +49,7 @@ func (vtbl *iShellItemArrayVtbl) getCount(objPtr unsafe.Pointer) (uintptr, error
func (vtbl *iShellItemArrayVtbl) getItemAt(objPtr unsafe.Pointer, index uintptr) (string, error) { func (vtbl *iShellItemArrayVtbl) getItemAt(objPtr unsafe.Pointer, index uintptr) (string, error) {
var shellItem *iShellItem var shellItem *iShellItem
ret, _, _ := syscall.Syscall(vtbl.GetItemAt, ret, _, _ := syscall.SyscallN(vtbl.GetItemAt,
2,
uintptr(objPtr), uintptr(objPtr),
index, index,
uintptr(unsafe.Pointer(&shellItem))) uintptr(unsafe.Pointer(&shellItem)))

View File

@ -1,5 +1,4 @@
//go:build windows //go:build windows
// +build windows
package cfd package cfd
@ -19,20 +18,16 @@ func hresultToError(hr uintptr) error {
} }
func (vtbl *iUnknownVtbl) release(objPtr unsafe.Pointer) error { func (vtbl *iUnknownVtbl) release(objPtr unsafe.Pointer) error {
ret, _, _ := syscall.Syscall(vtbl.Release, ret, _, _ := syscall.SyscallN(vtbl.Release,
0,
uintptr(objPtr), uintptr(objPtr),
0,
0) 0)
return hresultToError(ret) return hresultToError(ret)
} }
func (vtbl *iModalWindowVtbl) show(objPtr unsafe.Pointer, hwnd uintptr) error { func (vtbl *iModalWindowVtbl) show(objPtr unsafe.Pointer, hwnd uintptr) error {
ret, _, _ := syscall.Syscall(vtbl.Show, ret, _, _ := syscall.SyscallN(vtbl.Show,
1,
uintptr(objPtr), uintptr(objPtr),
hwnd, hwnd)
0)
return hresultToError(ret) return hresultToError(ret)
} }
@ -49,8 +44,16 @@ func (vtbl *iFileDialogVtbl) setFileTypes(objPtr unsafe.Pointer, filters []FileF
pszSpec: ole.SysAllocString(filter.Pattern), pszSpec: ole.SysAllocString(filter.Pattern),
} }
} }
ret, _, _ := syscall.Syscall(vtbl.SetFileTypes,
2, // Ensure memory is freed after use
defer func() {
for _, spec := range comDlgFilterSpecs {
ole.SysFreeString(spec.pszName)
ole.SysFreeString(spec.pszSpec)
}
}()
ret, _, _ := syscall.SyscallN(vtbl.SetFileTypes,
uintptr(objPtr), uintptr(objPtr),
uintptr(cFileTypes), uintptr(cFileTypes),
uintptr(unsafe.Pointer(&comDlgFilterSpecs[0]))) uintptr(unsafe.Pointer(&comDlgFilterSpecs[0])))
@ -82,21 +85,17 @@ func (vtbl *iFileDialogVtbl) setFileTypes(objPtr unsafe.Pointer, filters []FileF
// FOS_FORCEPREVIEWPANEON = 0x40000000, // FOS_FORCEPREVIEWPANEON = 0x40000000,
// FOS_SUPPORTSTREAMABLEITEMS = 0x80000000 // FOS_SUPPORTSTREAMABLEITEMS = 0x80000000
func (vtbl *iFileDialogVtbl) setOptions(objPtr unsafe.Pointer, options uint32) error { func (vtbl *iFileDialogVtbl) setOptions(objPtr unsafe.Pointer, options uint32) error {
ret, _, _ := syscall.Syscall(vtbl.SetOptions, ret, _, _ := syscall.SyscallN(vtbl.SetOptions,
1,
uintptr(objPtr), uintptr(objPtr),
uintptr(options), uintptr(options))
0)
return hresultToError(ret) return hresultToError(ret)
} }
func (vtbl *iFileDialogVtbl) getOptions(objPtr unsafe.Pointer) (uint32, error) { func (vtbl *iFileDialogVtbl) getOptions(objPtr unsafe.Pointer) (uint32, error) {
var options uint32 var options uint32
ret, _, _ := syscall.Syscall(vtbl.GetOptions, ret, _, _ := syscall.SyscallN(vtbl.GetOptions,
1,
uintptr(objPtr), uintptr(objPtr),
uintptr(unsafe.Pointer(&options)), uintptr(unsafe.Pointer(&options)))
0)
return options, hresultToError(ret) return options, hresultToError(ret)
} }
@ -122,11 +121,9 @@ func (vtbl *iFileDialogVtbl) setDefaultFolder(objPtr unsafe.Pointer, path string
return err return err
} }
defer shellItem.vtbl.release(unsafe.Pointer(shellItem)) defer shellItem.vtbl.release(unsafe.Pointer(shellItem))
ret, _, _ := syscall.Syscall(vtbl.SetDefaultFolder, ret, _, _ := syscall.SyscallN(vtbl.SetDefaultFolder,
1,
uintptr(objPtr), uintptr(objPtr),
uintptr(unsafe.Pointer(shellItem)), uintptr(unsafe.Pointer(shellItem)))
0)
return hresultToError(ret) return hresultToError(ret)
} }
@ -136,40 +133,32 @@ func (vtbl *iFileDialogVtbl) setFolder(objPtr unsafe.Pointer, path string) error
return err return err
} }
defer shellItem.vtbl.release(unsafe.Pointer(shellItem)) defer shellItem.vtbl.release(unsafe.Pointer(shellItem))
ret, _, _ := syscall.Syscall(vtbl.SetFolder, ret, _, _ := syscall.SyscallN(vtbl.SetFolder,
1,
uintptr(objPtr), uintptr(objPtr),
uintptr(unsafe.Pointer(shellItem)), uintptr(unsafe.Pointer(shellItem)))
0)
return hresultToError(ret) return hresultToError(ret)
} }
func (vtbl *iFileDialogVtbl) setTitle(objPtr unsafe.Pointer, title string) error { func (vtbl *iFileDialogVtbl) setTitle(objPtr unsafe.Pointer, title string) error {
titlePtr := ole.SysAllocString(title) titlePtr := ole.SysAllocString(title)
ret, _, _ := syscall.Syscall(vtbl.SetTitle, defer ole.SysFreeString(titlePtr) // Ensure the string is freed
1, ret, _, _ := syscall.SyscallN(vtbl.SetTitle,
uintptr(objPtr), uintptr(objPtr),
uintptr(unsafe.Pointer(titlePtr)), uintptr(unsafe.Pointer(titlePtr)))
0)
return hresultToError(ret) return hresultToError(ret)
} }
func (vtbl *iFileDialogVtbl) close(objPtr unsafe.Pointer) error { func (vtbl *iFileDialogVtbl) close(objPtr unsafe.Pointer) error {
ret, _, _ := syscall.Syscall(vtbl.Close, ret, _, _ := syscall.SyscallN(vtbl.Close,
1, uintptr(objPtr))
uintptr(objPtr),
0,
0)
return hresultToError(ret) return hresultToError(ret)
} }
func (vtbl *iFileDialogVtbl) getResult(objPtr unsafe.Pointer) (*iShellItem, error) { func (vtbl *iFileDialogVtbl) getResult(objPtr unsafe.Pointer) (*iShellItem, error) {
var shellItem *iShellItem var shellItem *iShellItem
ret, _, _ := syscall.Syscall(vtbl.GetResult, ret, _, _ := syscall.SyscallN(vtbl.GetResult,
1,
uintptr(objPtr), uintptr(objPtr),
uintptr(unsafe.Pointer(&shellItem)), uintptr(unsafe.Pointer(&shellItem)))
0)
return shellItem, hresultToError(ret) return shellItem, hresultToError(ret)
} }
@ -186,42 +175,51 @@ func (vtbl *iFileDialogVtbl) getResultString(objPtr unsafe.Pointer) (string, err
} }
func (vtbl *iFileDialogVtbl) setClientGuid(objPtr unsafe.Pointer, guid *ole.GUID) error { func (vtbl *iFileDialogVtbl) setClientGuid(objPtr unsafe.Pointer, guid *ole.GUID) error {
ret, _, _ := syscall.Syscall(vtbl.SetClientGuid, // Ensure the GUID is not nil
1, if guid == nil {
return fmt.Errorf("guid cannot be nil")
}
// Call the SetClientGuid method
ret, _, _ := syscall.SyscallN(vtbl.SetClientGuid,
uintptr(objPtr), uintptr(objPtr),
uintptr(unsafe.Pointer(guid)), uintptr(unsafe.Pointer(guid)))
0)
// Convert the HRESULT to a Go error
return hresultToError(ret) return hresultToError(ret)
} }
func (vtbl *iFileDialogVtbl) setDefaultExtension(objPtr unsafe.Pointer, defaultExtension string) error { func (vtbl *iFileDialogVtbl) setDefaultExtension(objPtr unsafe.Pointer, defaultExtension string) error {
if defaultExtension[0] == '.' { // Ensure the string is not empty before accessing the first character
if len(defaultExtension) > 0 && defaultExtension[0] == '.' {
defaultExtension = strings.TrimPrefix(defaultExtension, ".") defaultExtension = strings.TrimPrefix(defaultExtension, ".")
} }
// Allocate memory for the default extension string
defaultExtensionPtr := ole.SysAllocString(defaultExtension) defaultExtensionPtr := ole.SysAllocString(defaultExtension)
ret, _, _ := syscall.Syscall(vtbl.SetDefaultExtension, defer ole.SysFreeString(defaultExtensionPtr) // Ensure the string is freed
1,
// Call the SetDefaultExtension method
ret, _, _ := syscall.SyscallN(vtbl.SetDefaultExtension,
uintptr(objPtr), uintptr(objPtr),
uintptr(unsafe.Pointer(defaultExtensionPtr)), uintptr(unsafe.Pointer(defaultExtensionPtr)))
0)
// Convert the HRESULT to a Go error
return hresultToError(ret) return hresultToError(ret)
} }
func (vtbl *iFileDialogVtbl) setFileName(objPtr unsafe.Pointer, fileName string) error { func (vtbl *iFileDialogVtbl) setFileName(objPtr unsafe.Pointer, fileName string) error {
fileNamePtr := ole.SysAllocString(fileName) fileNamePtr := ole.SysAllocString(fileName)
ret, _, _ := syscall.Syscall(vtbl.SetFileName, defer ole.SysFreeString(fileNamePtr) // Ensure the string is freed
1, ret, _, _ := syscall.SyscallN(vtbl.SetFileName,
uintptr(objPtr), uintptr(objPtr),
uintptr(unsafe.Pointer(fileNamePtr)), uintptr(unsafe.Pointer(fileNamePtr)))
0)
return hresultToError(ret) return hresultToError(ret)
} }
func (vtbl *iFileDialogVtbl) setSelectedFileFilterIndex(objPtr unsafe.Pointer, index uint) error { func (vtbl *iFileDialogVtbl) setSelectedFileFilterIndex(objPtr unsafe.Pointer, index uint) error {
ret, _, _ := syscall.Syscall(vtbl.SetFileTypeIndex, ret, _, _ := syscall.SyscallN(vtbl.SetFileTypeIndex,
1,
uintptr(objPtr), uintptr(objPtr),
uintptr(index+1), // SetFileTypeIndex counts from 1 uintptr(index+1)) // SetFileTypeIndex counts from 1
0)
return hresultToError(ret) return hresultToError(ret)
} }

View File

@ -26,6 +26,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Added nil check for Drag-n-Drop on Windows. Fixed by in [PR](https://github.com/wailsapp/wails/pull/3597) by @leaanthony based on the suggestion by @Alpa-1 in [#3596](https://github.com/wailsapp/wails/issues/3596). - Added nil check for Drag-n-Drop on Windows. Fixed by in [PR](https://github.com/wailsapp/wails/pull/3597) by @leaanthony based on the suggestion by @Alpa-1 in [#3596](https://github.com/wailsapp/wails/issues/3596).
- Fixed typos in various .mdx files. [PR #3628](https://github.com/wailsapp/wails/pull/3628) by [@deining](https://github.com/deining) - Fixed typos in various .mdx files. [PR #3628](https://github.com/wailsapp/wails/pull/3628) by [@deining](https://github.com/deining)
- Fixed `notifyListeners()` race condition when terminated mid-emission [PR](https://github.com/wailsapp/wails/pull/3695) by [@mrf345](https://github.com/mrf345) - Fixed `notifyListeners()` race condition when terminated mid-emission [PR](https://github.com/wailsapp/wails/pull/3695) by [@mrf345](https://github.com/mrf345)
- Fixed dialogs in Windows when using Go 1.23 in [PR](https://github.com/wailsapp/wails/pull/3707) by [@leaanthony](https://github.com/leaanthony)
- Fixed drag and drop missing cursor icon [PR](https://github.com/wailsapp/wails/pull/3703) by [@mrf345](https://github.com/mrf345) - Fixed drag and drop missing cursor icon [PR](https://github.com/wailsapp/wails/pull/3703) by [@mrf345](https://github.com/mrf345)
### Changed ### Changed