1. 首页
  2. 主题
  3. Go问与答

咨询个go编译DLL并调用的报错的问题

hellsam · · 3520 次点击
【问题原因:】 1:我在 func PP2 函数 使用map转JSON ,json.Marshal(obj) 返回[]byte 在string(str) 得到string 但是返回 客户端直接报错 ,如果我直接使用 str :="JSON信息", 客户端调用OK。 【初步怀疑DLL服务端不能使用GO代码】,不知道有没有人遇到过这个问题。 2:原理很简单:就是 客户端吧数据传给DLL,然后DLL处理完毕,返回特定字符串我!并非整数 需要字符串返回的 3:我听说CGO调用CString后 貌似需要 C.free是否字符串 防止内存溢出, 不知道加哪里的 dll服务端代码部分: ~~~ package main // #include <stdio.h> // #include <stdlib.h> import ( "C" ) import ( "fmt" //"unsafe" ) //export PP2 func PP2(msg2 *C.char) *C.char { //只能使用str :="字符串",如果使用以下map组合JSON 客户端调用马上报错 //map1 := make(map[string]string) //map1["a"] = "1" //map1["b"] = "2" //map1["c"] = "3" //json1, _ := Serialize(map1)*/ //这个函数用的是json.Marshal(obj) 返回[]byte 转换后实际还是string //var str string = string(json1) str := `{"a":"111","b":"2","c":"3"}` msg2 = C.CString(str) return msg2 } func Serialize(obj interface{}) (b []byte, err error) { b, err = json.Marshal(obj) if err != nil { return nil, err } return b, nil } ~~~ 调用客户端: ~~~ func main() { //重来 dll3 := syscall.NewLazyDLL("mokuai2.dll") f := dll3.NewProc("PP2") r, _, _ := f.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("AAAA")))) //StringBytePtr //获取C返回指针 p := (*byte)(unsafe.Pointer(r)) data := make([]byte, 0) for *p != 0 { data = append(data, *p) r += unsafe.Sizeof(byte(0)) p = (*byte)(unsafe.Pointer(r)) } name := string(data) fmt.Println(name) } ~~~
更多评论
jan-bar
想要拥有,必定付出。
我怀疑`syscall.StringToUTF16Ptr`用的不对,改为`syscall.StringBytePtr`试试看。前者转换的结果是双字节数据,和`*C.char`内存布局不同。
#1
jan-bar
想要拥有,必定付出。
![image.png](https://static.golangjob.cn/221201/a9658d2274f76a4f73a3f1314b039f6b.png) 但是我试过可以啊。还有就是关于dll用法,一般都不会返回数据吧,而是传入参数(分配的内存,例如结构体之类的),由dll往入参内存里面写入数据,并返回写入数据长度。我看window相关dll都是这样方式返回调用方数据。你这里由dll申请C内存`msg2 = C.CString(str)`如果不找地方释放感觉会有内存泄露。通过入参传入内存块是调用方的内存,所以释放也是调用方的事情。
#3

用户登录

没有账号?注册

今日阅读排行

    加载中

一周阅读排行

    加载中