2016-08-12 4 views

답변

1

당신은,

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

당신은 일반적으로 C 코드로 이동 포인터를 통과 할 수하지 않을 LPCWSTR[]uint16로 "캐스트"할 수 있어야하고, 문자

를 디코딩 할 수 utf16 패키지를 사용한다

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

이 수도 ALS : LPCWSTR에 문자열 변환 할 때 그래서, 당신은 해결책처럼 보일 수있는 이동 문자열 s에서 변환 C에서 메모리를 ALLOC 할 것 o C에서 간단한 래퍼 함수로 활용할 수있는 cstring으로 변환하는 데 도움이되는 MFC 매크로가 될 수 있습니다. 이렇게하면 내장 된 C.CStringC.GoString 함수를 사용하여 데이터를 쉽게 복사 할 수 있습니다.

+0

이 모양이 맞습니까? https://gist.github.com/icholy/f8a07551c5aa3b97521767b1a3223275 –

+0

@iliacholy : 더 많은 정보를 추가했습니다. 아마도 포인터를 C 코드로 전달하는 것이 항상 안전하지 않을 수도 있기 때문에 C로 메모리를 할당하려고합니다. – JimB

+0

감사합니다. 고마워요! –