From 747a1217529b6bc8000e0b5349c9b08bf9e79a08 Mon Sep 17 00:00:00 2001 From: qianlifeng Date: Sun, 28 Apr 2024 20:56:33 +0800 Subject: [PATCH] Fix build error on windows --- .../single_instance_windows.go | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/Wox/util/single_instance/single_instance_windows.go b/Wox/util/single_instance/single_instance_windows.go index 1c3eb446f..ba9341ec4 100644 --- a/Wox/util/single_instance/single_instance_windows.go +++ b/Wox/util/single_instance/single_instance_windows.go @@ -5,9 +5,31 @@ package single_instance import ( "os" "syscall" + "unsafe" "wox/util" ) +const ( + LOCKFILE_EXCLUSIVE_LOCK = 2 +) + +var ( + kernel32 = syscall.MustLoadDLL("kernel32.dll") + procLockFileEx = kernel32.MustFindProc("LockFileEx") +) + +func LockFileEx(hFile syscall.Handle, dwFlags, dwReserved, nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh uint32, lpOverlapped *syscall.Overlapped) (err error) { + r1, _, e1 := syscall.Syscall6(procLockFileEx.Addr(), 6, uintptr(hFile), uintptr(dwFlags), uintptr(dwReserved), uintptr(nNumberOfBytesToLockLow), uintptr(nNumberOfBytesToLockHigh), uintptr(unsafe.Pointer(lpOverlapped))) + if r1 == 0 { + if e1 != 0 { + err = error(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func lock(content string) error { filename := util.GetLocation().GetAppLockFilePath() file, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, 0600) @@ -17,7 +39,7 @@ func lock(content string) error { defer file.Close() var overlapped syscall.Overlapped - err = syscall.LockFileEx(syscall.Handle(file.Fd()), syscall.LOCKFILE_EXCLUSIVE_LOCK, 0, 1, 0, &overlapped) + err = LockFileEx(syscall.Handle(file.Fd()), LOCKFILE_EXCLUSIVE_LOCK, 0, 1, 0, &overlapped) if err != nil { return err }