2017-12-26 21 views
0

Goプロジェクトで独自のDLLを使用しようとしています。 DLLのメソッドの記述のWindowsでDLLを使用する

一つ次のようになりますように私が何かをやっている私のテスト囲碁プロジェクトで

BYTE* Init(const BYTE* path, int id); 

:ライブラリが呼び出される

import (
    "golang.org/x/sys/windows" 
) 

var (
    lib = windows.MustLoadDLL("dllname.dll") 
    init = lib.MustFindProc("Init") 
) 

func main() { 
    path := "some" 
    bytePath = []byte(path) 

    init.Call(
    uintptr(unsafe.Pointer(&bytePath)), 
    uintptr(9) 
) 
} 

、エラーメッセージ「パスがあります存在していない "と私は思うが、私のパスのタイプは正しくないと思う。そのため、ライブラリはフォルダを見ることができません。

おそらくもっと良い方法がありますか? Goの使い方の悪いケースかもしれませんし、パッケージや言語を見つけるべきでしょうか?

+1

それは文法的に正しくないですので、私は非常に、エラーが「パスが存在していない」と言う疑問です。 _exact_エラーを貼り付けることはできますか? – Flimzy

+1

[タグ:c#]がこの質問に関連している理由がわからないので、削除しました。手元の問題に関連するタグのみを追加してください。 –

+0

@Flimzyええ、それはほんの一例でした。 dllの名前も 'dllname.dll'ではありません;) – MrTwister

答えて

5

あなたのパスは、おそらくNULを終了する必要があります。

import (
    "golang.org/x/sys/windows" 
) 

var (
    lib = windows.MustLoadDLL("dllname.dll") 
    init = lib.MustFindProc("Init") 
) 

func main() { 
    path := "some" 
    bytePath = []byte(path + "\x00") 

    init.Call(
    uintptr(unsafe.Pointer(&bytePath[0])), 
    uintptr(9) 
) 
} 
+0

なぜ&bytePath [0]を使用しますか?私はNULLで終了したパスを作成しようとしましたが、私は[0]についてはわかりません。私は、それが動作することを意味します!ありがとうございました!しかし、[0]は何で、これについてはどこで読むことができますか? – MrTwister

+1

@MrTwisterそれはGo文字列とWindowsが望むものとの違いによるものです。 Go文字列は、バイト配列の長さ+ポインタです。 Windows(すなわちC文字列)は、NULLで終わるバイト配列(0コードの文字)を必要とします。 'bytePath [0]'はバイト配列の最初の文字です。 –

+0

@ArmanOrdookhaniはい、私はNULL文字について知っていて、[0]は最初の要素です:)私にとって驚きは、私はポインタの最初の要素を&bytePathの代わりに使う必要があるということです。 – MrTwister

関連する問題