// multithread package main import ( // "C" "fmt" "syscall" "time" ) type DLL struct { *syscall.DLL } func GetDLL(name string) *DLL { d, e := syscall.LoadDLL(name) if e != nil { fmt.Printf("Abort... %s \n", e) } return &DLL{DLL: d} } func (d *DLL) Proc(name string) *syscall.Proc { p, e := d.FindProc(name) if e != nil { fmt.Printf("Abort... %s \n", e) } return p } func callback(param uintptr) (retv uintptr) { fmt.Printf("callback called from thread with id %d \n", param) return } func main() { c := syscall.NewCallback(callback) a, _, _ := GetDLL("multithreaded.dll").Proc("RegisterCallback").Call(c) if a != 0 { fmt.Printf("Croak register callback failed \n") } var numthrs uintptr = 1 a, _, _ = GetDLL("multithreaded.dll").Proc("FireThreads").Call(uintptr(numthrs)) if a != 0 { fmt.Printf("Croak Firethreads(%d) failed \n", numthrs) } time.Sleep(2 * time.Second) a, _, _ = GetDLL("multithreaded.dll").Proc("KillThreads").Call(uintptr(numthrs)) if a != 0 { fmt.Printf("Croak Firethreads(%d) failed \n", numthrs) } }