func Invoke(this *ole.IDispatch, dispid int, riid *ole.GUID, lcid int, flags int16, dispparams *ole.DISPPARAMS, result *ole.VARIANT, pexcepinfo *ole.EXCEPINFO, nerr *uint) uintptr { switch dispid { case 0: log.Println("DataArrival") winsock := (*EventReceiver)(unsafe.Pointer(this)).host var data ole.VARIANT ole.VariantInit(&data) oleutil.CallMethod(winsock, "GetData", &data) s := string(data.ToArray().ToByteArray()) println() println(s) println() case 1: log.Println("Connected") winsock := (*EventReceiver)(unsafe.Pointer(this)).host oleutil.CallMethod(winsock, "SendData", "GET / HTTP/1.0\r\n\r\n") case 3: log.Println("SendProgress") case 4: log.Println("SendComplete") case 5: log.Println("Close") this.Release() case 6: log.Fatal("Error") default: log.Println(dispid) } return ole.E_NOTIMPL }
// ConnectObject creates a connection point between two services for communication. func ConnectObject(disp *ole.IDispatch, iid *ole.GUID, idisp interface{}) (cookie uint32, err error) { unknown, err := disp.QueryInterface(ole.IID_IConnectionPointContainer) if err != nil { return } container := (*ole.IConnectionPointContainer)(unsafe.Pointer(unknown)) var point *ole.IConnectionPoint err = container.FindConnectionPoint(iid, &point) if err != nil { return } if edisp, ok := idisp.(*ole.IUnknown); ok { cookie, err = point.Advise(edisp) container.Release() if err != nil { return } } rv := reflect.ValueOf(disp).Elem() if rv.Type().Kind() == reflect.Struct { dest := &stdDispatch{} dest.lpVtbl = &stdDispatchVtbl{} dest.lpVtbl.pQueryInterface = syscall.NewCallback(dispQueryInterface) dest.lpVtbl.pAddRef = syscall.NewCallback(dispAddRef) dest.lpVtbl.pRelease = syscall.NewCallback(dispRelease) dest.lpVtbl.pGetTypeInfoCount = syscall.NewCallback(dispGetTypeInfoCount) dest.lpVtbl.pGetTypeInfo = syscall.NewCallback(dispGetTypeInfo) dest.lpVtbl.pGetIDsOfNames = syscall.NewCallback(dispGetIDsOfNames) dest.lpVtbl.pInvoke = syscall.NewCallback(dispInvoke) dest.iface = disp dest.iid = iid cookie, err = point.Advise((*ole.IUnknown)(unsafe.Pointer(dest))) container.Release() if err != nil { point.Release() return } } container.Release() return 0, ole.NewError(ole.E_INVALIDARG) }
// GetProperty retrieves property from IDispatch. func GetProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) { var dispid []int32 dispid, err = disp.GetIDsOfName([]string{name}) if err != nil { return } if len(params) < 1 { result, err = disp.Invoke(dispid[0], ole.DISPATCH_PROPERTYGET) } else { result, err = disp.Invoke(dispid[0], ole.DISPATCH_PROPERTYGET, params...) } return }
// CallMethod calls method on IDispatch with parameters. func CallMethod(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) { var dispid []int32 dispid, err = disp.GetIDsOfName([]string{name}) if err != nil { return } if len(params) < 1 { result, err = disp.Invoke(dispid[0], ole.DISPATCH_METHOD) } else { result, err = disp.Invoke(dispid[0], ole.DISPATCH_METHOD, params...) } return }