我正在使用 golang 调用 Dll 函数,例如char* fn(),该 dll 不是我自己编写的,我无法更改它。这是我的代码:
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)
}
我有一些疑问:
有更好的方法吗?像这样的 dll 函数有数百个,我必须为所有函数编写循环。
对于像100k+字节这样的非常长的字符串,会append()
导致性能问题吗?
解决了。原因unsafe.Pointer(r)
linter govet显示警告possible misuse of unsafe.Pointer
,但代码运行良好,如何避免此警告?解决方案:可以通过-unsafeptr=false
在govet
命令行中添加来解决,对于vim-ale,添加let g:ale_go_govet_options = '-unsafeptr=false'
。
慕村9548890
萧十郎
相关分类