dpj96988 2016-08-12 21:27
浏览 137
已采纳

CGO:在LPCWSTR和字符串之间转换

I'm writing CGO bindings for a library which uses LPCWSTR for all of its string types. How do I convert from C.LPCWSTR to string and vice-versa?

  • 写回答

1条回答 默认 最新

  • doutu1889 2016-08-12 21:44
    关注

    You should be able to "cast" the LPCWSTR as a []uint16, and use the utf16 package to decode the characters

    // take a C.wstr pointer, and convert it to a go slice
    // `sz` is the length of the LPCWSTR
    wstr := (*[1 << 30-1]uint16)(unsafe.Pointer(C.wstr))[:sz:sz]
    runes := utf16.Decode(wstr)
    goString := string(runes)
    

    You generally don't want to be passing Go pointers into your C code, so when converting from a string to an LPCWSTR, you will want to alloc the memory in C. A solution for converting from a Go string s might look like:

    func Encode(s string) C.LPCWSTR {
        wstr := utf16.Encode([]rune(s))
    
        p := C.calloc(C.size_t(len(wstr)+1), C.sizeof_uint16_t)
        pp := (*[1 << 30]uint16)(p)
        copy(pp[:], wstr)
    
        return (C.LPCWSTR)(p)
    }
    

    There may also be some MFC macros that could help convert to and from cstrings which you could take advantage of with simple wrapper functions in C. This way you could easily copy the data in and out just using the builtin C.CString and C.GoString functions.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题