如何从用C / C ++编写的DLL中调用导出的函数,返回类型是char *还是string?

时间:2012-09-13 01:33:29

标签: c++ dll go

我们设计了C / C ++ DLL:

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

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

当我们使用syscall:{/ p>在Go中调用这两个函数时

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

我们发现:

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

2 个答案:

答案 0 :(得分:2)

uintptr是表示指针的Go类型。您可以使用unsafe包并将其转换为unsafe.Pointer,然后您可以将unsafe.Pointer转换为任何Go指针类型。所以你可以做类似

的事情
str := (*uint8)(unsafe.Pointer(ret))

获得*uint8

答案 1 :(得分:1)

查看syscall.Getwd windows implementation http://code.google.com/p/go/source/browse/src/pkg/syscall/syscall_windows.go#323。它与您的问题不同:

  • 它将缓冲区传递给dll,而不是从dll接收;
  • 数据是uint16s(Microsoft WCHAR),而不是uint8s;
  • GetCurrentDirectory告诉我们结果字符串的长度,而您的示例可能希望您最后搜索0;

但是应该给你足够的线索。

亚历