分享

如何使用go调用dll函数?

 quasiceo 2014-01-16

如何使用go调用dll函数?

wgq91here 在 2013-07-10 14:11 发布 487 次点击

网上已经看了很多例子代码(多半是调用win系统函数),但对我的程序来说,得调用特定dll(c编写的),总是运行错误——直接中断。

已经确认的是: 1. 能正确调用了dll文件; 2. 调用参数如果都是0,则没有报错,当然结果也不正确;

不能解决的是: 参数的传递, dll的api是 *char 参数,实际上也就是字符; 我写的时候 按照例子如下:

...(获取句柄省略)

  1. r2, _, err := c.Call(uintptr(h),
  2. uintptr(unsafe.Pointer(&key)), // 就是这个位置 *char
  3. 0,0,0)

无论我怎么写,都是程序报错。错误有很多种。

有无例子,给我参考呀。


后续补充: 估计是调用过于简单,所以网上没有。只有自己,丰衣足食。


wgq91here 于 2013-07-10 22:51 修改
3 回复
#1 wgq91here
wgq91here ? 2013-07-10 22:45

自己搞定了,和golang代码一样,照抄,但得换成byte类型即可。

  1. func INT8FromString(s string) ([]byte, error) {
  2. for i := 0; i < len(s); i++ {
  3. if s[i] == 0 {
  4. return nil, nil
  5. }
  6. }
  7. return []byte(s), nil
  8. }

  9. func StringToINT8(s string) []byte {
  10. a, err := INT8FromString(s)
  11. if err != nil {
  12. panic("syscall: string with NUL passed to StringToINT8")
  13. }
  14. return a
  15. }

  16. func StringToINT8Ptr(s string) *byte { return &StringToINT8(s)[0] }

然后就可以调用了。

  1. retGet, getproc, geterr := g1.Call(
  2. uintptr(ret),
  3. uintptr(unsafe.Pointer(&buffer[0])),
  4. uintptr(1024),
  5. uintptr(unsafe.Pointer(StringToINT8Ptr(items))));

请不要传空值,可以用空格代替之。

#2 wgq91here
wgq91here ? 2013-07-10 22:48

最后实例代码,补充完成

  1. items := "string...."; // 字符 类似 *char
  2. buffer := make([]byte, 1024) // 指针位置
  3. retGet, getproc, geterr := g1.Call(
  4. uintptr(ret),
  5. uintptr(unsafe.Pointer(&buffer[0])),
  6. uintptr(1024),
  7. uintptr(unsafe.Pointer(StringToINT8Ptr(items))));
#3 wgq91here
wgq91here ? 2013-07-10 22:50

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多