package main import ( "fmt" "log" "syscall" ) type IDCRDriver struct { handle syscall.Handle pIdCardReset uintptr pGetIdCardInfo uintptr pGetIdCardNewaddr uintptr } func (d *IDCRDriver) Load(path string) error { var err error d.handle, err = syscall.LoadLibrary(path) if err != nil { return err } d.pIdCardReset, err = syscall.GetProcAddress(d.handle, "IdCardReset") if err != nil { log.Printf("GetProcAddress(IDCardReset) error: %s\n", err) } return nil } func (d *IDCRDriver) Free(path string) error { if d.handle != 0 { return syscall.FreeLibrary(d.handle) } return nil } func (d *IDCRDriver) IdCardReset(port, bp, baud int) (int, error) { if d.handle == 0 { return -1, fmt.Errorf("library not load") } ret, _, errno := syscall.SyscallN(d.pIdCardReset, uintptr(port), uintptr(bp), uintptr(baud)) if errno != 0 { return int(ret), fmt.Errorf("syscall error: %s", errno.Error()) } return int(ret), nil } func main() { driver := &IDCRDriver{} err := driver.Load("bfby_idcr.dll") if err != nil { panic(err) } ret, err := driver.IdCardReset(1, 0, 9600) if err != nil { fmt.Printf("IDCardReset error: %s\n", err) } else { fmt.Printf("IDCardReset returns: %d\n", ret) } }