mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-02 11:10:47 +08:00
65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
//go:build windows
|
|
// +build windows
|
|
|
|
package cfd
|
|
|
|
import (
|
|
"github.com/go-ole/go-ole"
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
const (
|
|
iidShellItemArrayGUID = "{b63ea76d-1f85-456f-a19c-48159efa858b}"
|
|
)
|
|
|
|
var (
|
|
iidShellItemArray *ole.GUID
|
|
)
|
|
|
|
func init() {
|
|
iidShellItemArray, _ = ole.IIDFromString(iidShellItemArrayGUID)
|
|
}
|
|
|
|
type iShellItemArray struct {
|
|
vtbl *iShellItemArrayVtbl
|
|
}
|
|
|
|
type iShellItemArrayVtbl struct {
|
|
iUnknownVtbl
|
|
BindToHandler uintptr
|
|
GetPropertyStore uintptr
|
|
GetPropertyDescriptionList uintptr
|
|
GetAttributes uintptr
|
|
GetCount uintptr // func (pdwNumItems *DWORD) HRESULT
|
|
GetItemAt uintptr // func (dwIndex DWORD, ppsi **IShellItem) HRESULT
|
|
EnumItems uintptr
|
|
}
|
|
|
|
func (vtbl *iShellItemArrayVtbl) getCount(objPtr unsafe.Pointer) (uintptr, error) {
|
|
var count uintptr
|
|
ret, _, _ := syscall.SyscallN(vtbl.GetCount,
|
|
uintptr(objPtr),
|
|
uintptr(unsafe.Pointer(&count)))
|
|
if err := hresultToError(ret); err != nil {
|
|
return 0, err
|
|
}
|
|
return count, nil
|
|
}
|
|
|
|
func (vtbl *iShellItemArrayVtbl) getItemAt(objPtr unsafe.Pointer, index uintptr) (string, error) {
|
|
var shellItem *iShellItem
|
|
ret, _, _ := syscall.SyscallN(vtbl.GetItemAt,
|
|
uintptr(objPtr),
|
|
index,
|
|
uintptr(unsafe.Pointer(&shellItem)))
|
|
if err := hresultToError(ret); err != nil {
|
|
return "", err
|
|
}
|
|
if shellItem == nil {
|
|
return "", ErrCancelled
|
|
}
|
|
defer shellItem.vtbl.release(unsafe.Pointer(shellItem))
|
|
return shellItem.vtbl.getDisplayName(unsafe.Pointer(shellItem))
|
|
}
|