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

     1  //go:build windows
     2  // +build windows
     3  
     4  package oleutil
     5  
     6  import (
     7  	"reflect"
     8  	"syscall"
     9  	"unsafe"
    10  
    11  	ole "github.com/gofiber/fiber/v2/internal/go-ole"
    12  )
    13  
    14  // ConnectObject creates a connection point between two services for communication.
    15  func ConnectObject(disp *ole.IDispatch, iid *ole.GUID, idisp interface{}) (cookie uint32, err error) {
    16  	unknown, err := disp.QueryInterface(ole.IID_IConnectionPointContainer)
    17  	if err != nil {
    18  		return
    19  	}
    20  
    21  	container := (*ole.IConnectionPointContainer)(unsafe.Pointer(unknown))
    22  	var point *ole.IConnectionPoint
    23  	err = container.FindConnectionPoint(iid, &point)
    24  	if err != nil {
    25  		return
    26  	}
    27  	if edisp, ok := idisp.(*ole.IUnknown); ok {
    28  		cookie, err = point.Advise(edisp)
    29  		container.Release()
    30  		if err != nil {
    31  			return
    32  		}
    33  	}
    34  	rv := reflect.ValueOf(disp).Elem()
    35  	if rv.Type().Kind() == reflect.Struct {
    36  		dest := &stdDispatch{}
    37  		dest.lpVtbl = &stdDispatchVtbl{}
    38  		dest.lpVtbl.pQueryInterface = syscall.NewCallback(dispQueryInterface)
    39  		dest.lpVtbl.pAddRef = syscall.NewCallback(dispAddRef)
    40  		dest.lpVtbl.pRelease = syscall.NewCallback(dispRelease)
    41  		dest.lpVtbl.pGetTypeInfoCount = syscall.NewCallback(dispGetTypeInfoCount)
    42  		dest.lpVtbl.pGetTypeInfo = syscall.NewCallback(dispGetTypeInfo)
    43  		dest.lpVtbl.pGetIDsOfNames = syscall.NewCallback(dispGetIDsOfNames)
    44  		dest.lpVtbl.pInvoke = syscall.NewCallback(dispInvoke)
    45  		dest.iface = disp
    46  		dest.iid = iid
    47  		cookie, err = point.Advise((*ole.IUnknown)(unsafe.Pointer(dest)))
    48  		container.Release()
    49  		if err != nil {
    50  			point.Release()
    51  			return
    52  		}
    53  		return
    54  	}
    55  
    56  	container.Release()
    57  
    58  	return 0, ole.NewError(ole.E_INVALIDARG)
    59  }