1

C/C++ DLL は次のように設計されています。

WIN32_DLL_EXPORT int FnRetInt(int i)
{
   ....
   return 32 ;
} 

WIN32_DLL_EXPORT char* FnRetString()
{
   return "THIS IS A TEST STRING" ;
}

Gosyscall を使用してこれら 2 つの関数を呼び出すと、次のようになります。

hd:=syscall.NewLazyDLL(dll_path)
proc:=hd.NewProc(dll_func_name)
ret:=proc.Call()

私たちは見つけました:

FnRetIntうまくいきましたが、FnRetStringしませんでした。proc.Call戻り値の型は ですuintptr。それを希望の型 (例: char* または string) に変更するにはどうすればよいですか?

4

2 に答える 2

2

Auintptrは、ポインターを表す Go 型です。unsafeパッケージを使用してに変換unsafe.Pointerすると、unsafe.Pointerを任意の Go ポインター型に変換できます。だからあなたは次のようなことができます

str := (*uint8)(unsafe.Pointer(ret))

バックを取得し*uint8ます。

于 2012-09-13T01:35:54.067 に答える
1

syscall.Getwd Windows 実装http://code.google.com/p/go/source/browse/src/pkg/syscall/syscall_windows.go#323を見てください。それはあなたの問題とは異なります:

  • dll からバッファーを受け取る代わりに、バッファーを dll に渡します。
  • データは uint8s ではなく uint16s (Microsoft WCHAR) です。
  • GetCurrentDirectory は、結果の文字列の長さを教えてくれますが、あなたの例では、おそらく最後に 0 を検索することを期待しています。

しかし、あなたに十分な手がかりを与えるはずです。

アレックス

于 2012-09-13T02:53:20.487 に答える