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?
CGO:在LPCWSTR和字符串之间转换
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
doutu1889 2016-08-12 21:44关注You should be able to "cast" the
LPCWSTRas a[]uint16, and use theutf16package 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
smight 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.CStringandC.GoStringfunctions.本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报