github.com/gofiber/fiber/v2@v2.47.0/internal/go-ole/iunknown_windows.go (about)

     1  //go:build windows
     2  // +build windows
     3  
     4  package ole
     5  
     6  import (
     7  	"reflect"
     8  	"syscall"
     9  	"unsafe"
    10  )
    11  
    12  func reflectQueryInterface(self interface{}, method uintptr, interfaceID *GUID, obj interface{}) (err error) {
    13  	selfValue := reflect.ValueOf(self).Elem()
    14  	objValue := reflect.ValueOf(obj).Elem()
    15  
    16  	hr, _, _ := syscall.Syscall(
    17  		method,
    18  		3,
    19  		selfValue.UnsafeAddr(),
    20  		uintptr(unsafe.Pointer(interfaceID)),
    21  		objValue.Addr().Pointer())
    22  	if hr != 0 {
    23  		err = NewError(hr)
    24  	}
    25  	return
    26  }
    27  
    28  func queryInterface(unk *IUnknown, iid *GUID) (disp *IDispatch, err error) {
    29  	hr, _, _ := syscall.Syscall(
    30  		unk.VTable().QueryInterface,
    31  		3,
    32  		uintptr(unsafe.Pointer(unk)),
    33  		uintptr(unsafe.Pointer(iid)),
    34  		uintptr(unsafe.Pointer(&disp)))
    35  	if hr != 0 {
    36  		err = NewError(hr)
    37  	}
    38  	return
    39  }
    40  
    41  func addRef(unk *IUnknown) int32 {
    42  	ret, _, _ := syscall.Syscall(
    43  		unk.VTable().AddRef,
    44  		1,
    45  		uintptr(unsafe.Pointer(unk)),
    46  		0,
    47  		0)
    48  	return int32(ret)
    49  }
    50  
    51  func release(unk *IUnknown) int32 {
    52  	ret, _, _ := syscall.Syscall(
    53  		unk.VTable().Release,
    54  		1,
    55  		uintptr(unsafe.Pointer(unk)),
    56  		0,
    57  		0)
    58  	return int32(ret)
    59  }