golang 调用 c++ DLL 如何获取 dll 返回的 string 类型值

gouser · · 7098 次点击
jan-bar
想要拥有,必定付出。
最近我也遇到相关问题,查阅go源码,结合自己的理解,得到解决方案。不过有几个方法是go1.17才有的,如果不是go1.17的话去找go源码吧。我是通过追踪os.Args的window源码搞出来的。 ```go func UintPtrToString(r uintptr) string { p := (*uint16)(unsafe.Pointer(r)) if p == nil { return "" } n, end, add := 0, unsafe.Pointer(p), unsafe.Sizeof(*p) for *(*uint16)(end) != 0 { end = unsafe.Add(end, add) n++ } return string(utf16.Decode(unsafe.Slice(p, n))) } ```
#8
更多评论
C++返回值应该是 char* ,返回的是指针,然后在Go中对这个int类型进行转换变成 指向 byte的指针,解引用就读出了这个 字节的值。C++中char* 类型是连续内存结构,最后以'0x00‘结尾,所以每读取依次 byte 对传回来的 指针进行偏移1 操作直到读取到'0x00‘ 认为是结尾。再把这个[]byte转换成 string就可以了。 首先要明确就是就是C++中的编码形式。
#1
首先三叩九拜跪谢大神。 其次有几个问题想请教下: 1. 目前 c++ 这边如果返回一个指针,显然不能返回栈上开辟的,也就是应该搞个 new 出来的玩意返回,否则c++函数返回后,go这边得到的是一个已经被释放了的,但是问题来了,go得到这个指针后,又不能释放,是不是造成了内存泄漏? 2. c++ 这边的返回 char 应该如何被 go 转换呢,新手不懂 ^_^ 再次六体投地请大神解答
#2