Go调用dll 解决方案 dll查看工具

news2024/11/18 3:21:24

准备工作
Go需要1.10版本,即支持动态链接库

基本调用代码

lib := syscall.NewLazyDLL("lib/plugin.dll") // 读取dll
f := lib.NewProc("Sum") // 调用dll函数
res, _, _ := f.Call(param) // 传值
fmt.Println(res)

可能出现的问题
%1 is not a valid Win32 application
这是由于调用的dll位数和系统版本位数不一致导致的,需要设置成与dll位数相同的编译环境,在cmd中使用以下命令

go env // 查看set GOARCH,如果系统是64位,则等于amd64,如果是32,则是386
go env -w GOARCH=386 // 设置32编译环境
go env -w GOARCH=amd64 // 设置64编译环境
 

The specified module could not be found
这个问题分为三种情况

dll路径不对
调整路径即可

dll依赖别的dll,依赖的dll缺失了

下载DependenciesGui,

https://github.com/lucasg/Dependencies

打开后,菜单栏点击file->open,选择需要查看的dll
在这里插入图片描述

当出现红色感叹号时,则说明缺失这个dll,就需要将这个缺失的dll放在与选择的dll同目录,解决后

这个dll本身有依赖的dll,且dll与依赖dll在同一目录,但是go业务代码与dll,被依赖的dll不在同一目录,
把dll,被依赖的所有dll与业务代码放在同一目录

数据类型问题
当传值或者接收值时,f.Call(param)。所有值的类型应该都是uintptr,应该注意数据类型的转换,以下代码仅做参考:

// string到uintptr.
func StrPtr(s string) uintptr {
	p, _ := syscall.UTF16PtrFromString(s)
	return uintptr(unsafe.Pointer(p))
}

// uintptr到string.
func PtrStr(p uintptr) string {
	return syscall.UTF16ToString(*(*[]uint16)(unsafe.Pointer(&p)))
}

// bool到uintptr.
func BoolPtr(b bool) uintptr {
	if b {
		return uintptr(1)
	}
	return uintptr(0)
}

// float32到uintptr.
func Float32Ptr(f float32) uintptr {
	return uintptr(*(*uint32)(unsafe.Pointer(&f)))
}

// uintptr到float32.
func PtrToFloat32(p uintptr) float32 {
	u := uint32(p)
	return *(*float32)(unsafe.Pointer(&u))
}

// int到uintptr
func IntPtr(i int) uintptr {
	return uintptr(i)
}

// int到uintptr
func PtrInt(u uintptr) int {
	return int(u)
}
 

示例代码

package main

import (
	"fmt"
	"syscall"
)

var (
	ta        = syscall.NewLazyDLL("AIO_API.dll")
	taInit3   = ta.NewProc("TA_Init3")
	taConsume = ta.NewProc("TA_Consume")
)

func main() {
	aio()
}

func aio() {
	str := StrPtr("str")
	i := IntPtr(123)
	b := BoolPtr(true)
	// 调用接口示例
	res, _, _ := taConsume.Call(str, i, b)
    fmt.Printf("%v", IntPtr(res))
}

目录结构

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/375056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

移动硬盘不显示怎么办?恢复硬盘的方法汇总

在日常工作和生活中,移动硬盘是非常重要的存储设备,它们可以储存大量的数据,比如照片、音乐、视频、文档等。但是,有时候你可能会遇到移动硬盘不显示的问题。这个问题通常会让人感到困惑,因为你无法访问移动硬盘里的数…

Appium自动化测试之启动时跳过初始化设置

Appium每次启动时都会检查和安装Appium Settings,这是完全没有必要的,在首次使用Appium连接设备是Appium Settings便已经安装好。怎样跳过安装Appium Settings呢?之前的做法是修改appium中的源文件中的android-helpers.js实现,如M…

足球俱乐部管理系统

技术:Java、JSP等摘要:网站是一种主要的渠道。人们通过互联网快速、准确的发布信息、获取信息。而足球俱乐部是足球职业化、专业化的一个标志,是足球运动员以足球谋生时,所被聘用的机构,应运时代发展,规模、…

观测云产品更新|新增用户访问监测自动化追踪;新增 CDN 质量分析;新增自定义查看器导航菜单等

观测云更新 用户访问监测优化 新增用户访问监测自动化追踪 用户访问监测新增自动化追踪,通过“浏览器插件”的实现方式,使用浏览器记录用户访问行为,创建无代码的端到端测试。更多详情可参考文档【 自动化追踪 】https://docs.guance.com/…

本机安装docker,redis并进行连接实战

1、背景 win10系统,想要在本机搭建一套开发环境,需要安装zk,redis等组件,一个个的安装显然效率太低且复杂,这里考虑安装docker及相关镜像 2、 docker安装 docker官网下载:https://docs.docker.com/desktop/install/…

Git的简述

Git 文章目录GitGit概述版本控制工具集中式管理控制工具分步式管理控制工具控制机制Git和代码托管中心安装Git软件Git常用命令Git概述 Git是一个免费的、开源的分步式版本控制系统,可以快速的处理从小型到大型的各种项目 Git 易于学习,占地面积小&…

【Linux | ELK 8.2】搭建ELKB集群Ⅱ—— 安装 Logstash 和 Kibana

目录2.3 安装Logstash(1)检查系统jdk版本(2)下载logstash(3)安装logstash(4)配置logstash(5)启动与测试方法1方法2(主要的使用方式)&a…

Python--深入浅出的装饰器--1

本章一起深入浅出一下装饰器。前面我们讲过一章装饰器了。不知道各位看懂了多少。每太看懂也没关系,本章就一起实操一下。简单的例子例1例2上述的两个例子,执行结果为:1423.为什么呢???解析语法糖&#xff…

sed 功能详解

介绍sedsed是一种流编辑器,它一次处理一行内容,把当前处理的行存储在临时缓冲区中(buffer),称为"模式空间",接着sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕&#…

面向Elasticsearch的高性能应用网关INFINI Gateway的介绍

1.微服务的API网关介绍网关的含义很多,应用范围也很广,不同的领域理解也不一样,站在分布式领域基于微服务的架构风格中,API网关其实就是一个微服务系统的统一入口。往往微服务是指由多个应用组成的一个个独立的服务系统&#xff0…

【C/C++】类型限定符extern、const、Volatile、register

1、extern: 声明一个变量,extern声明的变量没有建立存储空间。 extern int a ; //变量在定义的时候创建存储空间。 ①当我们在编译器中试图运行以下代码,系统会报错。 错误原因是“无法解析外部符号_a”.系统认为变量a是没有开辟内存空间的…

【3】MyBatis+Spring+SpringMVC+SSM整合一套通关

三、SpringMVC 1、SpringMVC简介 1.1、什么是MVC MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分 M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类称为实体…

网络应用之静态Web服务器-多任务版

静态Web服务器-多任务版学习目标能够写出多线程版的多任务web服务器程序1. 静态Web服务器的问题目前的Web服务器,不能支持多用户同时访问,只能一个一个的处理客户端的请求,那么如何开发多任务版的web服务器同时处理 多个客户端的请求?可以使…

ROS进行深度相机的标定

前言 自己使用标定板对深度相机进行标定。 参考:http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration 一、准备标定板 在下面的网站中可下载棋盘格标定板,可用A4纸打印下来。 http://wiki.ros.org/camera_calibration/Tutorials/…

Spring Boot整合Kaptcha实现验证码功能

目录一、前言1.Kaptcha 简介2.Kaptcha 详细配置表二、实现1.整合kaptcha,创建kaptcha的工具类1.1 添加依赖1.2 创建KaptchaConfig工具类2 编写接口,在接口中使用 kaptcha 工具类来生成验证码图片(验证码信息)并返回3 登录时从sess…

阻塞队列BlockingQueue

一、概念阻塞队列:从名字可以看出,他也是队列的一种,那么他肯定是一个先进先出(FIFO)的数据结构。与普通队列不同的是,它支持两个附加操作,即阻塞添加和阻塞删除方法。如上图,线程1往…

2023年值得参加的数学建模竞赛介绍

数学建模竞赛:一次参与,终身受益 博主7年数学建模竞赛经验,历史获奖率百分之百。团队成员都是拿过全国一等奖的硕博,有需要数模竞赛帮助的可以私信我。 有同学咨询还有那些数学建模比赛可以参加,哪些含金量比较高&…

Qt图片定时滚动播放器+透明过渡动画

目录参考结构PicturePlay.promain.cppmyqlabel.h 自定义QLabelmyqlabel.cpp自定义QLabelpictureplay.hpictureplay.cpppictureplay.uistyle.qss效果源码参考 Qt图片浏览器 QT制作一个图片播放器 Qt中自适应的labelpixmap充满窗口后,无法缩小只能放大 Qt的动画类修改…

3 决策树及Python实现

1 主要思想 1.1 数据 1.2 训练和使用模型 训练:建立模型(树) 测试:使用模型(树) Weka演示ID3(终端用户模式) 双击weka.jar选择Explorer载入weather.arff选择trees–>ID3构建树…

简单易懂又非常牛逼的Spring源码解析,推断构造与bean的实例化

简单易懂又非常牛逼的Spring源码解析,推断构造与bean的实例化原理解析实例化bean的入口工厂方法实例化推断构造初次筛选二次筛选bean的实例化代码走读实例化bean的入口createBeanInstance方法内部的流程推断构造初次筛选二次筛选bean的实例化总结往期文章&#xff1…