2013-11-01 5 views
5

私はGoを使用してWindows dllとインターフェースを取ろうとしています。私が使用したいdll関数はバイト配列へのポインタを受け取ります。したがって、私はバイト配列を与える必要があります。Golang:安全でない動的バイト配列

hereのように、syscall libaryを使用してdllを呼び出しています。私の基本的な要件です:私はバイト配列

  • へのポインタを取得する必要があります

    • 私はバイト配列
    • のための必要なサイズ与えられた私はバイト配列
    • を作成しています、私は、その後にポインタを渡しますWindowsのDLL

    goでバイト配列を作成し、そのポインタを取得する方法はわかりません。これは明らかに安全でない操作であり、unsafeライブラリが役に立ちますが、まずは動的長さのバイト配列を作成できる必要があります。 "make"を使ってスライスを作成しても、スライスのバッキング配列へのポインタを取得できない限り、私は役に立ちません。

    誰かがこれに遭遇しましたか、アイデアがありますか?

  • 答えて

    3

    私はsyscall.ComputerNameの実装https://golang.org/src/syscall/syscall_windows.go#395が良い例になると思います。それは、バイトではなくuint16sを使用しますが、それ以外の場合はです。

    アレックス

    +1

    華麗で、魅力的です。 'ptr:=&myslice [0]' – chowey

    3

    まあ、私は1つの全体的な解決策を見つけました。明らかに、structure of a sliceには、バッキングバイト配列へのポインタ、バッキングバイト配列の長さ、バッキングバイト配列の容量が含まれているようです。

    私はバイト配列へのポインタだけに興味があるので、スライスの内部データの最初のメンバーが必要です。

    Goのunsafe.Pointerは、安全でないポインタにスライスをキャストしませんが、安全でないポインタとしてスライスへのポインタをキャストします。私が望む古いタイプのポインタに安全でないポインタをキャストすることができるので、それをポインタへのポインタにキャストして、スライスの内部データの最初のメンバーを回復することができます。

    実例があります。私はuintptrが欲しかったですが、どのポインタ型にでもキャストできました。

    package main 
    
    import (
        "fmt" 
        "unsafe" 
    ) 
    
    func main() { 
        // Arbitrary size 
        n := 4 
    
        // Create a slice of the correct size 
        m := make([]int, n) 
    
        // Use convoluted indirection to cast the first few bytes of the slice 
        // to an unsafe uintptr 
        mPtr := *(*uintptr)(unsafe.Pointer(&m)) 
    
        // Check it worked 
        m[0] = 987 
        // (we have to recast the uintptr to a *int to examine it) 
        fmt.Println(m[0], *(*int)(unsafe.Pointer(mPtr))) 
    } 
    

    あなたの代わりに*intを望んでいた場合、あなたはmPtr := *(**int)(unsafe.Pointer(&m))

    を行うことができますこれは、限りスライスは、この内部データ構造を維持して動作します。 Goの内部構造に依存しない、より堅牢なソリューションに私は間違いなくオープンしています。

    +2

    m:= make([] int、10)スライスのバッキング配列の最初の要素へのポインタは&m [0]です。 – alex

    +0

    私の悪いです。私は前にm [0]と思ったものを試し、m [0]にあったもののコピーへのポインタを得ていました。明らかに私は間違ったことをしました。今試してみるとうまくいきます。 – chowey

    関連する問題