Call - call a function in a loaded library cribbed from: https://golang.org/src/Syscall/dll_windows.go On amd64, Call can pass and return floating-point values. To pass an argument x with C type "float", use uintptr(math.Float32bits(x)). To pass an argument with C type "double", use uintptr(math.F
(functionName string, args ...uintptr)
| 145 | // math.Float32frombits(uint32(r2)). For C type "double", it is |
| 146 | // math.Float64frombits(uint64(r2)). |
| 147 | func (l *Library) Call(functionName string, args ...uintptr) (uintptr, error) { |
| 148 | |
| 149 | proc, ok := l.FindProc(functionName) |
| 150 | if !ok { |
| 151 | return 0, errors.New("Call did not find export " + functionName) |
| 152 | } |
| 153 | var r uintptr |
| 154 | var errno syscall.Errno |
| 155 | var err error |
| 156 | switch len(args) { |
| 157 | case 0: |
| 158 | r, _, errno = syscall.Syscall(proc, uintptr(len(args)), 0, 0, 0) |
| 159 | case 1: |
| 160 | r, _, errno = syscall.Syscall(proc, uintptr(len(args)), args[0], 0, 0) |
| 161 | case 2: |
| 162 | r, _, errno = syscall.Syscall(proc, uintptr(len(args)), args[0], args[1], 0) |
| 163 | case 3: |
| 164 | r, _, errno = syscall.Syscall(proc, uintptr(len(args)), args[0], args[1], args[2]) |
| 165 | case 4: |
| 166 | r, _, errno = syscall.Syscall6(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], 0, 0) |
| 167 | case 5: |
| 168 | r, _, errno = syscall.Syscall6(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], 0) |
| 169 | case 6: |
| 170 | r, _, errno = syscall.Syscall6(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5]) |
| 171 | case 7: |
| 172 | r, _, errno = syscall.Syscall9(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], 0, 0) |
| 173 | case 8: |
| 174 | r, _, errno = syscall.Syscall9(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], 0) |
| 175 | case 9: |
| 176 | r, _, errno = syscall.Syscall9(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]) |
| 177 | case 10: |
| 178 | r, _, errno = syscall.Syscall12(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], 0, 0) |
| 179 | case 11: |
| 180 | r, _, errno = syscall.Syscall12(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], 0) |
| 181 | case 12: |
| 182 | r, _, errno = syscall.Syscall12(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11]) |
| 183 | case 13: |
| 184 | r, _, errno = syscall.Syscall15(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], 0, 0) |
| 185 | case 14: |
| 186 | r, _, errno = syscall.Syscall15(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], args[13], 0) |
| 187 | case 15: |
| 188 | r, _, errno = syscall.Syscall15(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], args[13], args[14]) |
| 189 | case 16: |
| 190 | r, _, errno = syscall.Syscall18(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], args[13], args[14], args[15], 0, 0) |
| 191 | case 17: |
| 192 | r, _, errno = syscall.Syscall18(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], args[13], args[14], args[15], args[16], 0) |
| 193 | case 18: |
| 194 | r, _, errno = syscall.Syscall18(proc, uintptr(len(args)), args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], args[13], args[14], args[15], args[16], args[17]) |
| 195 | default: |
| 196 | return 0, errors.New("Call " + functionName + " with too many arguments " + strconv.Itoa(len(args)) + ".") |
| 197 | } |
| 198 | if errno != 0 { |
| 199 | errString := errno.Error() |
| 200 | if errString != "" { |
| 201 | err = errors.New(errString) |
| 202 | } |
| 203 | } |
| 204 | return r, err |
no test coverage detected