当前位置: 首页 > news >正文

DLL的导出和调用

动态链接库在C++中非常重要,写了一个简单的例子用于DLL的导出和调用。

DLL的生成

头文件

#include<iostream>
#include<stdexcept> 
using namespace std;#define TESTAPI __declspec(dllexport)// 函数定义
extern "C" {TESTAPI int add(int a, int b);TESTAPI int sub(int a, int b);TESTAPI int mul(int a, int b);TESTAPI int div_(int a, int b);
}

源文件

#include"test.h"int add(int a, int b) {return a + b;
}int sub(int a, int b) {return a - b;
}int mul(int a, int b) {return a * b;
}int div_(int a, int b) {try {if (b == 0) {throw std::runtime_error("Division by zero error!"); // 抛出异常}return a / b;}catch (const std::runtime_error& e) {cout << "Error: " << e.what() << endl; // 捕获并处理异常return 0; // 或根据需求返回其他值}
}

配置类型DLL

image.png

生成DLL

image.png

DLL的调用

把生成的test1.dll放在测试工程test_useDll的目录下

image.png

调用DLL中的接口

#include <iostream>
#include <windows.h>  
using namespace std;// 声明函数指针
typedef int(*AddFunc)(int, int);
typedef int(*SubFunc)(int, int);
typedef int(*MulFunc)(int, int);
typedef int(*DivFunc)(int, int);int main() {// 加载DLLHINSTANCE hDLL = LoadLibraryA("test1.dll");if (!hDLL) {cout << "Failed to load DLL." << endl;return 1;}// 获取函数地址AddFunc add = (AddFunc)GetProcAddress(hDLL, "add");SubFunc sub = (SubFunc)GetProcAddress(hDLL, "sub");MulFunc mul = (MulFunc)GetProcAddress(hDLL, "mul");DivFunc div_ = (DivFunc)GetProcAddress(hDLL, "div_");if (!add || !sub || !mul || !div_) {cout << "Failed to get function address." << endl;FreeLibrary(hDLL);return 1;}// 调用DLL中的函数int a = 10, b = 5;cout << "add(a, b) = " << add(a, b) << endl;cout << "sub(a, b) = " << sub(a, b) << endl;cout << "mul(a, b) = " << mul(a, b) << endl;cout << "div_(a, b) = " << div_(a, b) << endl;// 释放DLLFreeLibrary(hDLL);return 0;
}

结果

image.png

相关文章:

DLL的导出和调用

动态链接库在C中非常重要&#xff0c;写了一个简单的例子用于DLL的导出和调用。 DLL的生成 头文件 #include<iostream> #include<stdexcept> using namespace std;#define TESTAPI __declspec(dllexport)// 函数定义 extern "C" {TESTAPI int add(in…...

vscode中调试cuda kernel

关于vscode中调试cpp可参考之前的博客&#xff1a;ubuntu vscode 基本设置 和 调试设置_ubuntu vscode 调试-CSDN博客 这篇我们来讲如何调试.cu的kernel&#xff0c;主要参考的是&#xff1a;https://www.zhihu.com/question/431782036/answer/2468791220 1、基本准备不多说&am…...

SQL的连接查询与pandas的对应关系

在SQL和Pandas中&#xff0c;连接查询&#xff08;join&#xff09;是处理数据集之间关系的重要工具。下面是SQL中的各种连接查询类型及其与Pandas中相应操作的对应关系&#xff1a; 1. INNER JOIN SQL: INNER JOIN 返回两个表中具有匹配值的行。 Pandas: merge() 方法的 how…...

【JS】中断和恢复任务序列

前言 封装processTasks函数&#xff0c;实现以下需求 /*** 依次顺序执行一系列任务* 所有任务全部完成后可以得到每个任务的执行结果* 需要返回两个方法&#xff0c;start用于启动任务&#xff0c;pause用于暂停任务* 每个任务具有原子性&#xff0c;即不可中断&#xff0c;只…...

CentOS系统下安装NVIDIA显卡驱动

一、安装显卡驱动 1.安装依赖项 yum -y install gcc pciutils yum -y install gcc yum -y install gcc-c yum -y install make2.查看内核版本 uname -a3.查看显卡版本 lspci | grep -i nvidia4.屏蔽系统自带的nouveau (1)查看nouveau lsmod | grep nouveau (2)打开blackl…...

Linux 与 Windows 服务器操作系统 | 全面对比

在服务器操作系统的领域&#xff0c;Linux 和 Windows 一直是两个备受关注的选择。 首先来看 Windows 操作系统。它由 Microsoft Corporation 开发&#xff0c;在桌面领域占据显著份额&#xff0c;其中 Windows 10 是使用最广泛的版本&#xff0c;广泛应用于个人计算机和企业桌…...

给既有exe程序添加一机一码验证

原文地址&#xff1a;李浩的博客 lihaohello.top 本科期间开发过一款混凝土基本构件设计程序&#xff0c;该程序是一个独立的exe可执行文件&#xff0c;采用VC静态链接MFC库编制而成。近期&#xff0c;需要为该程序添加用户注册验证的功能&#xff0c;从而避免任何用户获取该程…...

【Datawhale X 魔搭 】AI夏令营第四期大模型方向,Task2:头脑风暴会,巧灵脑筋急转弯(持续更新)

队伍名称&#xff1a;巧灵脑筋急转弯 队伍技术栈&#xff1a;python&#xff0c;LLM&#xff0c;RAG&#xff0c;大模型&#xff0c;nlp&#xff0c;Gradio&#xff0c;Vue&#xff0c;java 队友&#xff1a;知唐&#xff08;队长&#xff09;&#xff0c;我真的敲不动…...

mysql 多个外键

在MySQL中&#xff0c;一个表可以有多个外键约束&#xff0c;它们分别关联到不同的主表。在创建表时&#xff0c;可以在每个外键约束上指定不同的外键名称。以下是一个简单的例子&#xff0c;演示如何在创建表时定义多个外键&#xff1a; CREATE TABLE orders (order_id INT AU…...

解决方案上新了丨趋动科技推出基于银河麒麟操作系统的异构算力池化解决方案

趋动科技携手麒麟软件打造基于银河麒麟操作系统的异构算力池化解决方案&#xff0c;共同探索AI领域新场景。 人工智能技术作为数字经济发展的重要推手&#xff0c;在各行业业务场景中落地需要大量AI算力资源的有效保障。在IT基础设施普遍云化的今天&#xff0c;AI算力一方面需…...

14.创建一个实战maven的springboot项目

项目核心主要部分 pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://mave…...

docker部署LNMP

docker部署LNMP nginx 1.22 172.111.0.10 docker-nginx mysql 8.0.30 172.111.0.20 docker-mysql php 8.1.27 172.111.0.30 docker-php docker&#xff1a;单节点部署&#xff0c;只能在一台机器上部署&#xff0c;如果跨机器容器无法操作&#xff0c;无法通信。 做高可用…...

在Spring Boot应用中,如果你希望在访问应用时加上项目的名称或者一个特定的路径前缀

在Spring Boot应用中&#xff0c;如果你希望在访问应用时加上项目的名称或者一个特定的路径前缀 在Spring Boot应用中&#xff0c;如果你希望在访问应用时加上项目的名称或者一个特定的路径前缀&#xff0c;你可以通过配置server.servlet.context-path属性来实现。这通常在app…...

东南大学:Wi-Fi 6搭档全光以太,打造“数智东南”信息高速路

东南大学&#xff1a;Wi-Fi 6搭档全光以太&#xff0c;打造“数智东南”信息高速路 - 华为企业业务 打好ICT底座&#xff0c;平台和应用层面就会非常通畅了。首先&#xff0c;出海企业的需求既有普遍性&#xff0c;也有垂直性行业的特性需求。普遍性需求需要通信、沟通数据和传…...

C++:stack类(vector和list优缺点、deque)

目录 前言 数据结构 deque vector和list的优缺点 push pop top size empty 完整代码 前言 stack类就是数据结构中的栈 C数据结构&#xff1a;栈-CSDN博客 stack类所拥有的函数相比与string、vector和list类都少很多&#xff0c;这是因为栈这个数据结构是后进先出的…...

负载均衡、高可用

负载均衡 负载均衡&#xff08;Load Balance&#xff09;&#xff1a;可以利用多个计算机和组合进行海量请求处理&#xff0c;从而获得很高的处理效率&#xff0c;也可以用多个计算机做备份&#xff08;高可用&#xff09;&#xff0c;使得任何一个机器坏了整个系统还是能正常…...

从Retrofit支持suspend协程请求说开去

在现代Android开发中&#xff0c;异步请求已经成为不可或缺的一部分。传统的异步请求往往涉及大量的回调逻辑&#xff0c;使代码难以维护和调试。随着Kotlin协程的引入&#xff0c;异步编程得到了极大的简化。而作为最流行的网络请求库之一&#xff0c;Retrofit早在Kotlin协程的…...

深入浅出:你需要了解的用户数据报协议(UDP)

文章目录 **UDP概述****1. 无连接性****2. 尽最大努力交付****3. 面向报文****4. 多种交互通信支持****5. 较少的首部开销** **UDP报文的首部格式****详细解释每个字段** **UDP的多路分用模型****多路分用的实际应用** **检验和的计算方法****伪首部的详细内容****检验和计算步…...

C++的Magic Static

什么是“Magic Static”&#xff1f; C 中&#xff0c;函数内部的静态变量只会在第一次执行该函数时被初始化&#xff0c;而且这种初始化在 C11 标准之后是线程安全的。这意味着即使多个线程同时第一次调用该函数&#xff0c;静态变量也只会被初始化一次&#xff0c;并且在初始…...

vscode添加宏定义

1 起因 在用vscode看项目代码时&#xff0c;如果源文件中的代码块被某个宏定义给包裹住了&#xff0c;则在vscode的默认配置下&#xff0c;不会高亮显示这块被包裹住的代码&#xff0c;如下图中229行开始的代码被STM32F40_41xxx所控制&#xff0c;没有高亮显示。 由于STM32F4…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

归并排序:分治思想的高效排序

目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法&#xff0c;由约翰冯诺伊曼在1945年提出。其核心思想包括&#xff1a; 分割(Divide)&#xff1a;将待排序数组递归地分成两个子…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...