Fixes (windows).
This commit is contained in:
parent
93010811c3
commit
5348ab66b3
8 changed files with 37 additions and 39 deletions
|
@ -327,10 +327,10 @@ func initDirNameExt(filename string, name []uint16) (dir *uint16, ext *uint16) {
|
||||||
copy(name, syscall.StringToUTF16(n))
|
copy(name, syscall.StringToUTF16(n))
|
||||||
}
|
}
|
||||||
if d != "" {
|
if d != "" {
|
||||||
dir = strptr(d)
|
dir = syscall.StringToUTF16Ptr(d)
|
||||||
}
|
}
|
||||||
if len(e) > 1 {
|
if len(e) > 1 {
|
||||||
ext = strptr(e[1:])
|
ext = syscall.StringToUTF16Ptr(e[1:])
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,7 +71,7 @@ func CommDlgError() error {
|
||||||
if code := commDlgExtendedError(); code == 0 {
|
if code := commDlgExtendedError(); code == 0 {
|
||||||
return zenutil.ErrCanceled
|
return zenutil.ErrCanceled
|
||||||
} else {
|
} else {
|
||||||
return fmt.Errorf("Common Dialog error: %x", code)
|
return fmt.Errorf("common dialog error: %x", code)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,11 +15,11 @@ const (
|
||||||
ACTCTX_FLAG_HMODULE_VALID = 0x080
|
ACTCTX_FLAG_HMODULE_VALID = 0x080
|
||||||
|
|
||||||
// Control signals
|
// Control signals
|
||||||
CTRL_C_EVENT = 0
|
CTRL_C_EVENT = windows.CTRL_C_EVENT
|
||||||
CTRL_BREAK_EVENT = 1
|
CTRL_BREAK_EVENT = windows.CTRL_BREAK_EVENT
|
||||||
CTRL_CLOSE_EVENT = 2
|
CTRL_CLOSE_EVENT = windows.CTRL_CLOSE_EVENT
|
||||||
CTRL_LOGOFF_EVENT = 5
|
CTRL_LOGOFF_EVENT = windows.CTRL_LOGOFF_EVENT
|
||||||
CTRL_SHUTDOWN_EVENT = 6
|
CTRL_SHUTDOWN_EVENT = windows.CTRL_SHUTDOWN_EVENT
|
||||||
)
|
)
|
||||||
|
|
||||||
// https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-actctxw
|
// https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-actctxw
|
||||||
|
@ -37,11 +37,13 @@ type ACTCTX struct {
|
||||||
|
|
||||||
func GetCurrentThreadId() (id uint32) { return windows.GetCurrentThreadId() }
|
func GetCurrentThreadId() (id uint32) { return windows.GetCurrentThreadId() }
|
||||||
func GetSystemDirectory() (string, error) { return windows.GetSystemDirectory() }
|
func GetSystemDirectory() (string, error) { return windows.GetSystemDirectory() }
|
||||||
|
func GenerateConsoleCtrlEvent(ctrlEvent uint32, processGroupID uint32) (err error) {
|
||||||
|
return windows.GenerateConsoleCtrlEvent(ctrlEvent, processGroupID)
|
||||||
|
}
|
||||||
|
|
||||||
//sys ActivateActCtx(actCtx Handle, cookie *uintptr) (err error)
|
//sys ActivateActCtx(actCtx Handle, cookie *uintptr) (err error)
|
||||||
//sys CreateActCtx(actCtx *ACTCTX) (ret Handle, err error) [failretval==^Handle(0)] = CreateActCtxW
|
//sys CreateActCtx(actCtx *ACTCTX) (ret Handle, err error) [failretval==^Handle(0)] = CreateActCtxW
|
||||||
//sys DeactivateActCtx(flags uint32, cookie uintptr) (err error)
|
//sys DeactivateActCtx(flags uint32, cookie uintptr) (err error)
|
||||||
//sys GenerateConsoleCtrlEvent(ctrlEvent uint32, processGroupId int) (err error)
|
|
||||||
//sys GetConsoleWindow() (ret HWND)
|
//sys GetConsoleWindow() (ret HWND)
|
||||||
//sys GetModuleHandle(moduleName *uint16) (ret Handle, err error) = GetModuleHandleW
|
//sys GetModuleHandle(moduleName *uint16) (ret Handle, err error) = GetModuleHandleW
|
||||||
//sys GlobalAlloc(flags uint32, bytes uintptr) (ret Handle, err error)
|
//sys GlobalAlloc(flags uint32, bytes uintptr) (ret Handle, err error)
|
||||||
|
|
|
@ -62,8 +62,8 @@ func unkcall(self, trap uintptr, a ...uintptr) (r1, r2 uintptr, lastErr error) {
|
||||||
|
|
||||||
type IBindCtx struct{ IUnknown }
|
type IBindCtx struct{ IUnknown }
|
||||||
|
|
||||||
//sys CoCreateInstance(clsid uintptr, unkOuter *IUnknown, clsContext int32, iid uintptr, address unsafe.Pointer) (res error) = ole32.CoCreateInstance
|
//sys CoCreateInstance(clsid *GUID, unkOuter *IUnknown, clsContext int32, iid *GUID, address unsafe.Pointer) (res error) = ole32.CoCreateInstance
|
||||||
|
|
||||||
func uuid(s string) uintptr {
|
func guid(s string) *GUID {
|
||||||
return (*reflect.StringHeader)(unsafe.Pointer(&s)).Data
|
return (*GUID)(unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&s)).Data))
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,9 +3,10 @@
|
||||||
package win
|
package win
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"reflect"
|
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
"golang.org/x/sys/windows"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -120,9 +121,9 @@ type IDLIST struct{}
|
||||||
// https://github.com/wine-mirror/wine/blob/master/include/shobjidl.idl
|
// https://github.com/wine-mirror/wine/blob/master/include/shobjidl.idl
|
||||||
|
|
||||||
var (
|
var (
|
||||||
IID_IShellItem = uuid("\x1e\x6d\x82\x43\x18\xe7\xee\x42\xbc\x55\xa1\xe2\x61\xc3\x7b\xfe")
|
IID_IShellItem = guid("\x1e\x6d\x82\x43\x18\xe7\xee\x42\xbc\x55\xa1\xe2\x61\xc3\x7b\xfe")
|
||||||
IID_IFileOpenDialog = uuid("\x88\x72\x7c\xd5\xad\xd4\x68\x47\xbe\x02\x9d\x96\x95\x32\xd9\x60")
|
IID_IFileOpenDialog = guid("\x88\x72\x7c\xd5\xad\xd4\x68\x47\xbe\x02\x9d\x96\x95\x32\xd9\x60")
|
||||||
CLSID_FileOpenDialog = uuid("\x9c\x5a\x1c\xdc\x8a\xe8\xde\x4d\xa5\xa1\x60\xf8\x2a\x20\xae\xf7")
|
CLSID_FileOpenDialog = guid("\x9c\x5a\x1c\xdc\x8a\xe8\xde\x4d\xa5\xa1\x60\xf8\x2a\x20\xae\xf7")
|
||||||
)
|
)
|
||||||
|
|
||||||
type IFileOpenDialog struct{ IFileDialog }
|
type IFileOpenDialog struct{ IFileDialog }
|
||||||
|
@ -240,16 +241,14 @@ type iShellItemVtbl struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *IShellItem) GetDisplayName(name int) (res string, err error) {
|
func (u *IShellItem) GetDisplayName(name int) (res string, err error) {
|
||||||
var ptr uintptr
|
var ptr *uint16
|
||||||
vtbl := *(**iShellItemVtbl)(unsafe.Pointer(u))
|
vtbl := *(**iShellItemVtbl)(unsafe.Pointer(u))
|
||||||
hr, _, _ := u.call(vtbl.GetDisplayName, uintptr(name), uintptr(unsafe.Pointer(&ptr)))
|
hr, _, _ := u.call(vtbl.GetDisplayName, uintptr(name), uintptr(unsafe.Pointer(&ptr)))
|
||||||
if hr != 0 {
|
if hr != 0 {
|
||||||
err = syscall.Errno(hr)
|
err = syscall.Errno(hr)
|
||||||
} else {
|
} else {
|
||||||
var buf []uint16
|
res = windows.UTF16PtrToString(ptr)
|
||||||
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf))
|
CoTaskMemFree(unsafe.Pointer(ptr))
|
||||||
hdr.Data, hdr.Len, hdr.Cap = uintptr(ptr), 32768, 32768
|
|
||||||
res = syscall.UTF16ToString(buf)
|
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -286,6 +285,6 @@ func (u *IShellItemArray) GetItemAt(index uint32) (item *IShellItem, err error)
|
||||||
|
|
||||||
//sys ExtractAssociatedIcon(instance Handle, path *uint16, icon *uint16) (ret Handle, err error) = shell32.ExtractAssociatedIconW
|
//sys ExtractAssociatedIcon(instance Handle, path *uint16, icon *uint16) (ret Handle, err error) = shell32.ExtractAssociatedIconW
|
||||||
//sys SHBrowseForFolder(bi *BROWSEINFO) (ret *IDLIST) = shell32.SHBrowseForFolder
|
//sys SHBrowseForFolder(bi *BROWSEINFO) (ret *IDLIST) = shell32.SHBrowseForFolder
|
||||||
//sys SHCreateItemFromParsingName(path *uint16, bc *IBindCtx, iid uintptr, item **IShellItem) (res error) = shell32.SHCreateItemFromParsingName
|
//sys SHCreateItemFromParsingName(path *uint16, bc *IBindCtx, iid *GUID, item **IShellItem) (res error) = shell32.SHCreateItemFromParsingName
|
||||||
//sys ShellNotifyIcon(message uint32, data *NOTIFYICONDATA) (ok bool) = shell32.Shell_NotifyIconW
|
//sys ShellNotifyIcon(message uint32, data *NOTIFYICONDATA) (ok bool) = shell32.Shell_NotifyIconW
|
||||||
//sys SHGetPathFromIDListEx(ptr *IDLIST, path *uint16, pathLen int, opts int) (ok bool) = shell32.SHGetPathFromIDListEx
|
//sys SHGetPathFromIDListEx(ptr *IDLIST, path *uint16, pathLen int, opts int) (ok bool) = shell32.SHGetPathFromIDListEx
|
||||||
|
|
|
@ -265,9 +265,12 @@ func GetWindowThreadProcessId(hwnd HWND, pid *uint32) (tid uint32, err error) {
|
||||||
|
|
||||||
func GetWindowText(wnd HWND) string {
|
func GetWindowText(wnd HWND) string {
|
||||||
len, _ := getWindowTextLength(wnd)
|
len, _ := getWindowTextLength(wnd)
|
||||||
|
if len == 0 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
buf := make([]uint16, len+1)
|
buf := make([]uint16, len+1)
|
||||||
getWindowText(wnd, &buf[0], len+1)
|
getWindowText(wnd, &buf[0], len+1)
|
||||||
return syscall.UTF16ToString(buf)
|
return windows.UTF16ToString(buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
func SendMessagePointer(wnd HWND, msg uint32, wparam uintptr, lparam unsafe.Pointer) (ret uintptr) {
|
func SendMessagePointer(wnd HWND, msg uint32, wparam uintptr, lparam unsafe.Pointer) (ret uintptr) {
|
||||||
|
|
|
@ -5,9 +5,12 @@ package win
|
||||||
|
|
||||||
import "golang.org/x/sys/windows"
|
import "golang.org/x/sys/windows"
|
||||||
|
|
||||||
type Handle = windows.Handle
|
type (
|
||||||
type HWND = windows.HWND
|
Handle = windows.Handle
|
||||||
type Pointer = windows.Pointer
|
HWND = windows.HWND
|
||||||
|
Pointer = windows.Pointer
|
||||||
|
GUID = windows.GUID
|
||||||
|
)
|
||||||
|
|
||||||
// https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-systemtime
|
// https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-systemtime
|
||||||
type SYSTEMTIME struct {
|
type SYSTEMTIME struct {
|
||||||
|
|
|
@ -58,7 +58,6 @@ var (
|
||||||
procActivateActCtx = modkernel32.NewProc("ActivateActCtx")
|
procActivateActCtx = modkernel32.NewProc("ActivateActCtx")
|
||||||
procCreateActCtxW = modkernel32.NewProc("CreateActCtxW")
|
procCreateActCtxW = modkernel32.NewProc("CreateActCtxW")
|
||||||
procDeactivateActCtx = modkernel32.NewProc("DeactivateActCtx")
|
procDeactivateActCtx = modkernel32.NewProc("DeactivateActCtx")
|
||||||
procGenerateConsoleCtrlEvent = modkernel32.NewProc("GenerateConsoleCtrlEvent")
|
|
||||||
procGetConsoleWindow = modkernel32.NewProc("GetConsoleWindow")
|
procGetConsoleWindow = modkernel32.NewProc("GetConsoleWindow")
|
||||||
procGetModuleHandleW = modkernel32.NewProc("GetModuleHandleW")
|
procGetModuleHandleW = modkernel32.NewProc("GetModuleHandleW")
|
||||||
procGlobalAlloc = modkernel32.NewProc("GlobalAlloc")
|
procGlobalAlloc = modkernel32.NewProc("GlobalAlloc")
|
||||||
|
@ -182,14 +181,6 @@ func DeactivateActCtx(flags uint32, cookie uintptr) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func GenerateConsoleCtrlEvent(ctrlEvent uint32, processGroupId int) (err error) {
|
|
||||||
r1, _, e1 := syscall.Syscall(procGenerateConsoleCtrlEvent.Addr(), 2, uintptr(ctrlEvent), uintptr(processGroupId), 0)
|
|
||||||
if r1 == 0 {
|
|
||||||
err = errnoErr(e1)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetConsoleWindow() (ret HWND) {
|
func GetConsoleWindow() (ret HWND) {
|
||||||
r0, _, _ := syscall.Syscall(procGetConsoleWindow.Addr(), 0, 0, 0, 0)
|
r0, _, _ := syscall.Syscall(procGetConsoleWindow.Addr(), 0, 0, 0, 0)
|
||||||
ret = HWND(r0)
|
ret = HWND(r0)
|
||||||
|
@ -227,8 +218,8 @@ func ReleaseActCtx(actCtx Handle) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func CoCreateInstance(clsid uintptr, unkOuter *IUnknown, clsContext int32, iid uintptr, address unsafe.Pointer) (res error) {
|
func CoCreateInstance(clsid *GUID, unkOuter *IUnknown, clsContext int32, iid *GUID, address unsafe.Pointer) (res error) {
|
||||||
r0, _, _ := syscall.Syscall6(procCoCreateInstance.Addr(), 5, uintptr(clsid), uintptr(unsafe.Pointer(unkOuter)), uintptr(clsContext), uintptr(iid), uintptr(address), 0)
|
r0, _, _ := syscall.Syscall6(procCoCreateInstance.Addr(), 5, uintptr(unsafe.Pointer(clsid)), uintptr(unsafe.Pointer(unkOuter)), uintptr(clsContext), uintptr(unsafe.Pointer(iid)), uintptr(address), 0)
|
||||||
if r0 != 0 {
|
if r0 != 0 {
|
||||||
res = syscall.Errno(r0)
|
res = syscall.Errno(r0)
|
||||||
}
|
}
|
||||||
|
@ -250,8 +241,8 @@ func SHBrowseForFolder(bi *BROWSEINFO) (ret *IDLIST) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func SHCreateItemFromParsingName(path *uint16, bc *IBindCtx, iid uintptr, item **IShellItem) (res error) {
|
func SHCreateItemFromParsingName(path *uint16, bc *IBindCtx, iid *GUID, item **IShellItem) (res error) {
|
||||||
r0, _, _ := syscall.Syscall6(procSHCreateItemFromParsingName.Addr(), 4, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(bc)), uintptr(iid), uintptr(unsafe.Pointer(item)), 0, 0)
|
r0, _, _ := syscall.Syscall6(procSHCreateItemFromParsingName.Addr(), 4, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(bc)), uintptr(unsafe.Pointer(iid)), uintptr(unsafe.Pointer(item)), 0, 0)
|
||||||
if r0 != 0 {
|
if r0 != 0 {
|
||||||
res = syscall.Errno(r0)
|
res = syscall.Errno(r0)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue