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

hellsam · 2022-12-01 00:30:47 · 3115 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2022-12-01 00:30:47 的主题,其中的信息可能已经有所发展或是发生改变。

【问题原因:】

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)
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3115 次点击  
加入收藏 微博
12 回复  |  直到 2023-01-28 14:02:32
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传