1

我们这样设计 C/C++ DLL:

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

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

Go当我们使用 syscall调用这两个函数时:

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

我们找到:

FnRetInt工作正常,但FnRetString没有。proc.Call返回类型是uintptr,我们如何将其更改为我们想要的类型(例如:char* 或字符串)?

4

2 回答 2

2

Auintptr是表示指针的 Go 类型。您可以使用该unsafe包并将其转换为unsafe.Pointer,然后您可以将 an 转换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 接收缓冲区;
  • 数据是 uint16s (Microsoft WCHARs),而不是 uint8s;
  • GetCurrentDirectory 告诉我们结果字符串将有多长,而您的示例可能希望您在末尾搜索 0;

但应该给你足够的线索。

亚历克斯

于 2012-09-13T02:53:20.487 回答