github.com/AlpineAIO/wails/v2@v2.0.0-beta.32.0.20240505041856-1047a8fa5fef/internal/go-common-file-dialog/cfd/iShellItemArray.go (about) 1 //go:build windows 2 // +build windows 3 4 package cfd 5 6 import ( 7 "github.com/go-ole/go-ole" 8 "syscall" 9 "unsafe" 10 ) 11 12 const ( 13 iidShellItemArrayGUID = "{b63ea76d-1f85-456f-a19c-48159efa858b}" 14 ) 15 16 var ( 17 iidShellItemArray *ole.GUID 18 ) 19 20 func init() { 21 iidShellItemArray, _ = ole.IIDFromString(iidShellItemArrayGUID) 22 } 23 24 type iShellItemArray struct { 25 vtbl *iShellItemArrayVtbl 26 } 27 28 type iShellItemArrayVtbl struct { 29 iUnknownVtbl 30 BindToHandler uintptr 31 GetPropertyStore uintptr 32 GetPropertyDescriptionList uintptr 33 GetAttributes uintptr 34 GetCount uintptr // func (pdwNumItems *DWORD) HRESULT 35 GetItemAt uintptr // func (dwIndex DWORD, ppsi **IShellItem) HRESULT 36 EnumItems uintptr 37 } 38 39 func (vtbl *iShellItemArrayVtbl) getCount(objPtr unsafe.Pointer) (uintptr, error) { 40 var count uintptr 41 ret, _, _ := syscall.Syscall(vtbl.GetCount, 42 1, 43 uintptr(objPtr), 44 uintptr(unsafe.Pointer(&count)), 45 0) 46 if err := hresultToError(ret); err != nil { 47 return 0, err 48 } 49 return count, nil 50 } 51 52 func (vtbl *iShellItemArrayVtbl) getItemAt(objPtr unsafe.Pointer, index uintptr) (string, error) { 53 var shellItem *iShellItem 54 ret, _, _ := syscall.Syscall(vtbl.GetItemAt, 55 2, 56 uintptr(objPtr), 57 index, 58 uintptr(unsafe.Pointer(&shellItem))) 59 if err := hresultToError(ret); err != nil { 60 return "", err 61 } 62 if shellItem == nil { 63 return "", ErrCancelled 64 } 65 defer shellItem.vtbl.release(unsafe.Pointer(shellItem)) 66 return shellItem.vtbl.getDisplayName(unsafe.Pointer(shellItem)) 67 }