func Str2uft16ptr(str string)(p uintptr){//将字符串转为utf16指针
e:=utf16.Encode([]rune(str))//转成unicode
e=append(e, uint16(0))//添加末尾的0
p=uintptr(unsafe.Pointer(&e[0]))//转成指针
//p=uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(str)))
return
}
func addbuf(buf []uint16,newcap int)(newbuf []uint16){
newbuf=make([]uint16,newcap)
copy(newbuf,buf)
return
}
func Utf16prt2str(p uintptr)(str string){//将utf16指针转为字符串
len:=0
buf:=make([]uint16,64)
for a:=(*(*uint16)(unsafe.Pointer(p)));a!=0;len++{
if len>=cap(buf){
buf=addbuf(buf,len*2)
}
buf[len]=a
p+=2//uint16占2字节
a=(*(*uint16)(unsafe.Pointer(p)))
}
str=string(utf16.Decode(buf[:len]))
return
}
测试代码(Windows下)
func abort(funcname string, err error) {
panic(funcname + " failed: " + err.Error())
}
func msgbox3(text,title string)(res int32){
h, err := syscall.LoadLibrary("user32.dll")
if err != nil {
abort("LoadLibrary", err)
}
defer syscall.FreeLibrary(h)
proc, err := syscall.GetProcAddress(h, "MessageBoxW")
if err != nil {
abort("GetProcAddress", err)
}
r,_,_:=syscall.Syscall6(uintptr(proc), 4, 0, Str2uft16ptr(text), Str2uft16ptr(title),3,0,0)
res=int32(r)
return
}
func main(){
c,t:="你好","提示"
pc,pt:=Str2uft16ptr(c),Str2uft16ptr(t)
c,t=Utf16prt2str(pc),Utf16prt2str(pt)
msgbox3(c,t)
}