40 lines
777 B
Go
40 lines
777 B
Go
//go:build windows
|
|
|
|
package combridge
|
|
|
|
import (
|
|
"unsafe"
|
|
|
|
"golang.org/x/sys/windows"
|
|
)
|
|
|
|
var (
|
|
modkernel32 = windows.NewLazySystemDLL("kernel32.dll")
|
|
procGlobalAlloc = modkernel32.NewProc("GlobalAlloc")
|
|
procGlobalFree = modkernel32.NewProc("GlobalFree")
|
|
|
|
uintptrSize = unsafe.Sizeof(uintptr(0))
|
|
)
|
|
|
|
func allocUintptrObject(size int) (uintptr, []uintptr) {
|
|
v := globalAlloc(uintptr(size) * uintptrSize)
|
|
slice := unsafe.Slice((*uintptr)(unsafe.Pointer(v)), size)
|
|
return v, slice
|
|
}
|
|
|
|
func globalAlloc(dwBytes uintptr) uintptr {
|
|
ret, _, _ := procGlobalAlloc.Call(uintptr(0), dwBytes)
|
|
if ret == 0 {
|
|
panic("globalAlloc failed")
|
|
}
|
|
|
|
return ret
|
|
}
|
|
|
|
func globalFree(data uintptr) {
|
|
ret, _, _ := procGlobalFree.Call(data)
|
|
if ret != 0 {
|
|
panic("globalFree failed")
|
|
}
|
|
}
|