go 调用dll char*传输

举报
风吹稻花香 发表于 2021/06/04 23:04:55 2021/06/04
【摘要】   参考:http://www.voidcn.com/article/p-ofnbgvoa-bpv.html https://stackoverflow.com/questions/53721215/syscall-mustloaddll-mustfindproc-throws-the-specified-procedure-could-not-be-fo c...

 

参考:http://www.voidcn.com/article/p-ofnbgvoa-bpv.html

https://stackoverflow.com/questions/53721215/syscall-mustloaddll-mustfindproc-throws-the-specified-procedure-could-not-be-fo

c++:

MYLIBDLL char* testchar(int plus1);
MYLIBDLL void greet(char *name);


  
  1. void greet(char *name)
  2. {
  3. printf("Hello, %s!\n", name);
  4. }
  5. char* testchar(int plus1) {
  6. char* str = "hello world111111";
  7. return str;
  8. }

 

 

main.go代码:


  
  1. package main
  2. import (
  3. "syscall"
  4. "unsafe"
  5. "fmt"
  6. )
  7. import "C"
  8. func callDll() {
  9. dll := syscall.MustLoadDLL("hik_client.dll")
  10. procGreet := dll.MustFindProc("greet")
  11. procGreet.Call(uintptr(unsafe.Pointer(syscall.StringBytePtr("Cynhard11"))))
  12. procName := dll.MustFindProc("testchar")
  13. r, _, _ := procName.Call(1)
  14. // 获取C返回的指针。
  15. // 注意C返回的r为char*,对应的Go类型为*byte
  16. p := (*byte)(unsafe.Pointer(r))
  17. // 定义一个[]byte切片,用来存储C返回的字符串
  18. data := make([]byte, 0)
  19. // 遍历C返回的char指针,直到 '\0' 为止
  20. for *p != 0 {
  21. data = append(data, *p) // 将得到的byte追加到末尾
  22. r += unsafe.Sizeof(byte(0)) // 移动指针,指向下一个char
  23. p = (*byte)(unsafe.Pointer(r)) // 获取指针的值,此时指针已经指向下一个char
  24. }
  25. name := string(data) // 将data转换为字符串
  26. fmt.Printf("Hello, %s!\n", name)
  27. //var a = make([]byte, 256)
  28. //
  29. //
  30. //dll32 := syscall.NewLazyDLL("hik_client.dll")
  31. //fmt.Println("call dll:", dll32.Name)
  32. //GetPeopleName := dll32.NewProc("testchar")
  33. //
  34. //ret,_,err := GetPeopleName.Call(uintptr(unsafe.Pointer(&a)),2)
  35. //if err != nil {
  36. // fmt.Println(ret,a)
  37. // aaa := C.GoString(ret)
  38. // //C.free(unsafe.Pointer(cs))
  39. // //C.free(unsafe.Pointer(result))
  40. // //fmt.Println(aaa,a)
  41. //}
  42. //result, a, _ := g.Call(4)
  43. //fmt.Println("result is :", ret)
  44. }
  45. func main() {
  46. fmt.Println("start111111111!")
  47. callDll()
  48. //fmt.Println(C.add(2, 1))
  49. }

 

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/88381387

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。