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  }