I'm using golang to call a Dll function like char* fn()
, the dll is not written by myself and I cannot change it. Here's my code:
package main
import (
"fmt"
"syscall"
"unsafe"
)
func main() {
dll := syscall.MustLoadDLL("my.dll")
fn := dll.MustFindProc("fn")
r, _, _ := fn.Call()
p := (*byte)(unsafe.Pointer(r))
// define a slice to fill with the p string
data := make([]byte, 0)
// loop until find '\0'
for *p != 0 {
data = append(data, *p) // append 1 byte
r += unsafe.Sizeof(byte(0)) // move r to next byte
p = (*byte)(unsafe.Pointer(r)) // get the byte value
}
name := string(data) // convert to Golang string
fmt.Println(name)
}
I have some questions:
- Is there any better way of doing this? There're hundred of dll functions like this, I'll have to write the loop for all functions.
- For very-long-string like 100k+ bytes, will
append()
cause performance issue? -
Solved. the
unsafe.Pointer(r)
causes linter govet shows warningpossible misuse of unsafe.Pointer
, but the code runs fine, how to avoid this warning? Solution: This can be solved by adding-unsafeptr=false
togovet
command line, for vim-ale, addlet g:ale_go_govet_options = '-unsafeptr=false'
.