Skip to content

Instantly share code, notes, and snippets.

@houaq
Last active December 21, 2023 09:20
Show Gist options
  • Select an option

  • Save houaq/39ddd16f6a622a694157bc7f6a8b976d to your computer and use it in GitHub Desktop.

Select an option

Save houaq/39ddd16f6a622a694157bc7f6a8b976d to your computer and use it in GitHub Desktop.
Call dll functions from golang
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)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment