【问题标题】:Passing pointer from go to c-dll将指针从 go 传递到 c-dll
【发布时间】:2018-12-20 09:14:03
【问题描述】:

我正在尝试将双指针传递给由 C 在制作 dll 包装器 pacakge 时制作的 dll。

下面是 C 代码。

int getData(uint32_t ** buffer, uint32* sizeofBuffer) {
  //...
  *sizeofBuffer = n;
  *buffer = new uint32_t[n];

  //do something 
   return 0; 
}

void releaseBuf(void* buffer) {
     delete buffer;
}

下面是代码。我希望下面的代码进展顺利,但事实并非如此。

var (
   Handle =  syscall.LoadLibrary(`library\myDll.dll`)
   procGet,_ = syscall.GetProcAddress(Handle, "getData")
   procRelease,_ = syscall.GetProcAddress(Handle, "releaseBuf")
)
func main() {
   var bufferPtr *uint32
   var size uint32
   _,_,err := syscall.Syscall(proc,uintptr(2), uintptr(unsafe.Pointer(&bufferPtr )), uintptr(unsafe.Pointer(&size)),uintptr(0))
   if 0 != err {log.Fatal(syscall.Errno(err))}

var i uintptr = 0
for ; i<(uintptr)(size); i++ {
    log.Printf("%d", (**uint32)(uintptr(unsafe.Pointer(bufferPtr ))+uintptr(i)*unsafe.Sizeof(*bufferPtr )))
}

   _,_,err := syscall.Syscall(proc,uintptr(1), uintptr(unsafe.Pointer(bufferPtr)), uintptr(0), uintptr(0))
   if 0 != err {log.Fatal(syscall.Errno(err))}    
}

任何人都知道我错过了什么。

【问题讨论】:

    标签: go system-calls


    【解决方案1】:

    重新检查,发现我的错。

    用下面的替换例程

    log.Printf("%d", *(*uint32)(unsaef.Pointer(uintptr(unsafe.Pointer(buffer))+i*unsafe.Sizeof(*buffer))))
    

    :)

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 2017-08-30
      • 2021-06-29
      相关资源
      最近更新 更多