go 调用dll char*传输

2023-11-14

 

参考: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);


void greet(char *name)
{
	printf("Hello, %s!\n", name);
}
char* testchar(int plus1) {

	char* str = "hello world111111";
	return str;
}

 

 

main.go代码:

package main

import (
    "syscall"
    "unsafe"
    "fmt"
)
import "C"

func callDll() {


    dll := syscall.MustLoadDLL("hik_client.dll")

    procGreet := dll.MustFindProc("greet")
    procGreet.Call(uintptr(unsafe.Pointer(syscall.StringBytePtr("Cynhard11"))))

    procName := dll.MustFindProc("testchar")
    r, _, _ := procName.Call(1)
    // 获取C返回的指针。
    // 注意C返回的r为char*,对应的Go类型为*byte
    p := (*byte)(unsafe.Pointer(r))
    // 定义一个[]byte切片,用来存储C返回的字符串
    data := make([]byte, 0)
    // 遍历C返回的char指针,直到 '\0' 为止
    for *p != 0 {
        data = append(data, *p)  // 将得到的byte追加到末尾
        r += unsafe.Sizeof(byte(0))  // 移动指针,指向下一个char
        p = (*byte)(unsafe.Pointer(r))  // 获取指针的值,此时指针已经指向下一个char
    }
    name := string(data)  // 将data转换为字符串

    fmt.Printf("Hello, %s!\n", name)

    //var a = make([]byte, 256)
    //
    //
    //dll32 := syscall.NewLazyDLL("hik_client.dll")
    //fmt.Println("call dll:", dll32.Name)
    //GetPeopleName := dll32.NewProc("testchar")
    //
    //ret,_,err := GetPeopleName.Call(uintptr(unsafe.Pointer(&a)),2)
    //if err != nil {
    //    fmt.Println(ret,a)
    //    aaa := C.GoString(ret)
    //    //C.free(unsafe.Pointer(cs))
    //    //C.free(unsafe.Pointer(result))
    //    //fmt.Println(aaa,a)
    //}
    //result, a, _ := g.Call(4)


    //fmt.Println("result is :", ret)
}

func main() {
    fmt.Println("start111111111!")
    callDll()
    //fmt.Println(C.add(2, 1))
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go 调用dll char*传输 的相关文章

随机推荐

  • Node 调试利器,前端、Node 开发必备 - VSCode JS Debug Terminal

    经常看到有同学抱怨 Node 调试麻烦或者是搞不清怎么调试各种脚本 Jest Webpack 等等 而偶尔看到的调试相关的文章又全都是在写 inspect launch json 这些方案 其实有一定学习成本 而其实在 VSCode 中早已
  • [OCCT] Open CASCADE Technology的编译(包含示例的编译)

    QQ交流群 604668232 OCCT知识库 yuque com softdev occt 持续更新 相关文档 官方文档 构建 调试和升级 官方文档 OCCT的构建 文章目录 源代码目录 编译源代码 方法一 使用官方提供的VS工程 方法二
  • 【AAAI-2019】论文整理(清单)

    AAAI 19 Accepted Papers Main Technical Track 整理自 AAAI官网 分类整理持续更新 详细文章可从arXiz org下载 CircConv A Structured Convolution wit
  • VSCode远程配置流程(详细图解)

    基本情况 基本需求 本地 Win10 系统下安装 VSCode 连接远程的服务器 Ubuntu 进行代码编写和调试 下载地址 vscode 图文安装流程 Remote SSH 远程插件 按照下图安装即可 安装完成后 弹出如下图中红色框内的控
  • VoTT使用教程

    VoTT是微软发布的用于图像目标检测的标注工具 它是基于javascript开发的 因此可以跨Windows Linux和Mac平台运行 并且支持从图片和视频读取标注 此外 其还提供了基于CNTK训练的faster rcnn模型进行自动标注
  • 如何查看本机 MySQL(DB)安装位置

    首先按住 win R 键 输入 services msc 找到正在运行的 MySQL 打开属性 之后就可以找到 文件路径了
  • 【八股】2023秋招八股复习笔记2(C++基础 & 操作系统)

    文章目录 1 内存深拷贝 代码 2 C 基础知识 虚函数了解吗 说一下static 关键字的作用 说一下C 和C 的区别 c 中四种强制 cast 转换 请说一下C C 中指针和引用的区别 请你说一下你理解的c 中的smart pointe
  • ESP32/ESP8266使用MicroPython控制DHT11/DHT22

    本教程介绍了如何使用MicroPython固件将DHT11或DHT22温度和湿度传感器与ESP32和ESP8266开发板一起使用 DHT模块 刷新MicroPython固件 要遵循本教程 您需要在ESP32或ESP8266板上安装Micro
  • 微信小程序开发入门——uni-app框架

    uni app Union Application 是一个基于Vue js的前端框架 开发规范借鉴了微信小程序 前端技能点 前后端分离 后端给接口和API文档 注重前端 用uni app框架 作用 创业团队可以更快的开发上线一个app 更容
  • 参数估计(Parameter Estimation):频率学派(最大似然估计MLE、最大后验估计MAP)与贝叶斯学派(贝叶斯估计BPE)

    基础 频率学派与贝叶斯学派 http www douban com group topic 16719644 http www zhihu com question 20587681 最大似然估计 Maximum likelihood es
  • 排序算法-----希尔排序

    目录 前言 希尔排序 shell 排序原理 大致思路 示例 代码实现 C语言 算法分析 时间复杂度 空间复杂度 稳定性 前言 前面我有一篇插入排序的详细的文章讲解 链接 排序算法 插入排序 图文详解 灰勒塔德的博客 CSDN博客 今天我们接
  • uniapp使用原生小程序插件

    本文主要讲述在uniapp上使用原生插件步骤 1 在使用插件之前 先登录微信公众平台 在微信公众平台 点击左下角设置 第三方设置 添加插件 输入插件名字 点击确定提交申请 申请通过后可以使用该插件 第一步 2 搜索你需要的插件点击添加 1
  • ConvenientBanner的基本使用

    前言 关于com bigkoo convenientbanner使用方法的步骤 1 compile com bigkoo convenientbanner 2 0 5 2 布局使用
  • Studio 更新的时候提示Connection failed (connect timed out). Please check network connection and try again.

    如下图 经百度后 明白要有以下操作 修改 ANDROID STUDIO HOME bin 下的 studio exe vmoptions 或者studio64 exe vmoptions 配置后追加如下 Djava net preferIP
  • Python 爬虫时间优化——设置不自动读取响应正文,避免自动读取大文件

    Python 爬虫优化 设置不自动读取响应正文 避免自动读取大文件 有的童鞋可能发现 自己的项目 自从按推荐 升级uillib库到urllib3之后 爬虫什么的 有时候会特别耗时 然而自己只不过是分析一下网页 不该如此 排查时我们往往发现
  • uniapp 中父组件调用子组件方法

    需求描述 随着开发的深入和代码的维护 为了某些功能的实现可以说是又秃了几根 接下来就说一说 通过 ref 实现父组件调用子组件的方法等 1 父组件模板 在父级模块的子组件上添加属性 ref 和 属性名 mySon 随意 调用时使用 this
  • MYSQL中概念模型的基本概念_数据库基本概念

    一 数据抽象 物理抽象 概念抽象 视图级抽象 内模式 模式 外模式 模型是对现实世界的抽象 在数据库技术中 我们用数据模型的概念描述数据库的结构和语义 对现实世界的数据进行抽象 从现实世界的信息到数据库存储的数据以及用户使用的数据是一个逐步
  • Qt中传引用

    定义函数 void ProcessA QByteArray buf int start pos QVector
  • Redis 7 第八讲 集群模式(cluster)架构篇

    集群架构 Redis 集群架构图 集群定义 Redis 集群是一个提供在多个Redis节点间共享数据的程序集 Redis集群可以支持多个master 应用场景 Redis集群支持多个master 每个master又可以挂载多个slave 读
  • go 调用dll char*传输

    参考 http www voidcn com article p ofnbgvoa bpv html https stackoverflow com questions 53721215 syscall mustloaddll mustfi