2017-07-27 14 views
0

[32]C.wchar_tをgo文字列に変換します。GoLang C.wchar_tを文字列に変換します。

typedef struct myStruct { 
    WCHAR someString[32]; 
} 

次のように私は行くに構造体を定義しています:

type myStruct struct { 
    someString [32]C.wchar_t 
} 

私はdllのメソッドを持っている私が話しているdllに次のように

配列が定義されています。

DLLINTERFACE HRESULT __stdcall GetMyStruct (myStruct* ptrMyStruct); 

このメソッドは、someStringmyStructのフィールド。

私はそうのようなメソッドを呼び出しています(これは正しく動作している、私はsomeStringの内容を見ることができていない、と思う):

func getMyStruct() (*myStruct, uintptr) { 
    var getMyStruct = dll.MustFindProc("GetMyStruct") 
    var args = new(myStruct) 
    ret, _, _ := getMyStruct .Call(uintptr(unsafe.Pointer(args))) 

    fmt.Printf("Return: %d\n", (int)(ret)) 
    return args, ret 
} 

私は、外出先文字列へsomeStringを変換する必要があります。私は"github.com/GeertJohan/cgo.wchar"を使用しようとしましたが、[]C.whar_tを文字列に変換する方法はありません。

現在、私のgo structが正しいかどうかはわかりません。私はmyStructをdllに送信する前に正しく初期化しているかどうかもわかりません。

ご協力いただきますようお願い申し上げます。

答えて

1

Windowsでは、wchar_tは通常、UTF-16(リトルエンディアン)です。通常、BOM(デコーダがビッグエンディアンまたはリトルエンディアン形式で格納されているかどうかを検出できるように存在する)から始まります。

utf16パッケージがありますが、これは個々のルーンを変換するだけです。ただし、追加のunicodeテキストエンコードパッケージがあります。

あなたは、おそらくこのようなものだろう:

dec:=unicode.UTF16(unicode.LittleEndian,unicode.UseBOM).NewDecoder() 
out,err:= dec.Bytes(([]byte)(unsafe.Pointer(args.someString))) 
if err!=nil { 
    //handle error 
} 
// Strings are null terminated, only want content up to null byte 
i:=bytes.IndexByte(out,0) 
if i==-1 { 
    i = len(out) 
} 
s:=string(out[:i]) 

は、しかし、私は32文字(16刺さ=文字あたり2バイト)バイトの量である[64]byteとしてsomeStringを宣言するために誘惑されるだろう必要になるでしょう。これは危険な型キャストを避けることができますが、上記のように動作するはずです。

コードは上記&は必ずしも動作しない場合があり、例として意図されるように、私はオフに私の頭の上にこれをやっているから

0

:-)危険を覚悟での使用にはGeertJohanのライブラリがされていないようですより最近のcgoの変更のために更新されましたが、フォークがある場合は代わりにgithub.com/vitaminwater/cgo.wchargodoc)を試してください。

C関数がC型に書き込む場合は、C型の変数を渡します。

A(危険な)例:

package main 

/* 
#include <wchar.h> 
#include <string.h> 

typedef struct myStruct { 
    wchar_t someString[32]; 
} myStruct; 

wchar_t sample[6] = {0x0048, 0x0069, 0x0020, 0x4e16, 0x754c, 0}; 

void writeSample(myStruct *m) { 
    memcpy(m->someString, &sample, sizeof(wchar_t) * 6); 
} 
*/ 
import "C" 
import (
    "fmt" 
    "log" 
    "unsafe" 

    "github.com/vitaminwater/cgo.wchar" 
) 

func main() { 

    m := C.myStruct{} 

    C.writeSample(&m) 

    s, err := wchar.WcharStringPtrToGoString(unsafe.Pointer(&m.someString)) 
    if err != nil { 
     log.Fatal(err) 
    } 
    fmt.Println(s) 
} 

この出力:

Hi 世界

関連する問題