Dev c++ C语言实现第一个 dll 动态链接库 创建与调用

代码来源: 

极简版 C++ 动态链接库(DLL)创建与调用 - 知乎 (zhihu.com)

现在移植到Devc++ 里

首先创建DLL 项目,如果不创建,直接粘贴代码编译不通过,应该是项目里指定了链接类型。

如图:

然后选择如图 

随便新建一个文件夹为保存的地方。

然后

 删除里面的代码因为模板给的是WIN32的代码,我看不懂,和知乎的代码有区别,所以当时直接删除了模板的代码。然后复制粘贴以下的代码,或者刚才知乎链接里的代码,这里只有头文件名称不同。

dll.cpp文件内容:

// dll.cpp: 与预编译标头对应的源文件#include "dll.h"// 当使用预编译的头时,需要使用此源文件,编译才能成功。using namespace std;void mainDll(double a, double b, double c[], double* aplusb)
{*aplusb = a + b;for (int i = 0; i < sizeof(c) / sizeof(c[0]); i++)c[i] += 1;
}

dll.h 文件内容 

// dll.h 的内容
#ifndef DLL_H
#define DLL_Hextern "C"
{void mainDll(double a, double b, double c[], double* aplusb);
}#endif //DLL_H

然后点击编译,就会在和cpp同文件夹里生成一个.dll 文件

然后进行主函数调用

首先 Ctrl+N 新建源文件,不要加进项目里

然后 复制粘贴以下代码

#include <windows.h>
#include <iostream>using namespace std;int main()
{HINSTANCE hDLL = LoadLibrary("dll.dll"); // 填文件名typedef void (*func)(double a, double b, double c[], double* aplusb);  // 填调用的输入参数func callDll = (func)GetProcAddress(hDLL, "mainDll"); // 填调用的 dll 函数名double a = 1, b = 2, c[3] = {4, 5, 6}, result;callDll(a, b, c, &result);cout << a << endl;cout << b << endl;cout << result << endl;cout << c[0] << c[1] << c[2] << endl;
}

然后点击编译运行

 随便写一个名称,再找个位置保存,然后把之前的dll.dll文件拖到这个刚刚选好的位置

然后点击devc++ 的运行 按钮,即可弹出数字计算,因为直接点exe 不会中断程序,直接退出,就导致闪一下程序结束,没来得及看到运行效果。

 最后是DLL 检测丢失问题,这也可以从中看出了dll 的特性,只有被调用的时候才会进入程序,否则理都不理。这也为日后准备游戏插件提供了很好的作用——没有即使插件,程序也不会爆掉,可以正常运行。

#include <windows.h>
#include <iostream>using namespace std;int main()
{char ch;while(1){ch='j';cout<<"按 Q键调用dll"<<endl;cin>> ch;if(ch=='q'||ch=='Q'){HINSTANCE hDLL = LoadLibrary("dllq.dll"); // 填文件名typedef void (*func)(double a, double b, double c[], double* aplusb);  // 填调用的输入参数func callDll = (func)GetProcAddress(hDLL, "mainDll"); // 填调用的 dll 函数名if(callDll==NULL){cout<<"dll丢失"<<endl;}else{double a = 1, b = 2, c[3] = {4, 5, 6}, result;callDll(a, b, c, &result);cout << a << endl;cout << b << endl;cout << result << endl;cout << c[0] << c[1] << c[2] << endl;}}Sleep(20);}}

 和dll.dll放在一起,这个时候也能点击exe文件,按键盘 q 然后按回车,才进行调用了。

 dllq.dll改成dll.dll就不会提示丢失了。一定记得改完再编译,否则devc++ 运行的是没有被编译覆盖的旧exe文件!!!

至于多个程序同时运行调用dll 文件和 多个dll 文件被一个程序调用写写代码自己测试即可。

至于dll文件读取,做成插件,这个需要另一个代码——文件读取,因为现在是把dll的文件名写进程序里,每次更新功能,就得重写程序,所以需要尝试直接读取已有的dll名字,不用固定几个dll名称才能被调用。但是目前还没来得及写,可以参考之前的文件树调用,读取文件夹里所有文件和通配符即可自行穷举解决方案

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重磅!天途推出平安校园管理平台

天途平安校园管理平台&#xff0c;是围绕校园安全事件开发的一款智能监控与巡逻系统。系统通过大疆机场、无人机和校园内的监控硬件等多端传输的视频和图片信息&#xff0c;经过 AI分析处理后形成告警信息并及时通知学校安保人员。 天途平安校园管理平台 平安校园管理平台优势 …

【动态规划】【01背包】Leetcode 416. 分割等和子集

【动态规划】【01背包】Leetcode 416. 分割等和子集 ---------------&#x1f388;&#x1f388;416. 分割等和子集 题目链接&#x1f388;&#x1f388;------------------- 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0…

第一次在msf控制台中运行search命令提示Module database cache not built yet问题解决

0x00 问题描述 在新装的kali虚拟机中使用msfconsole执行search命令时提示Module database cache not built yet问题&#xff0c;显然&#xff0c;是我们相关的数据库缓存存在问题。 故障现象&#xff1a; 0x01 启动数据库服务 msf中的search功能是基于postgresql来实现的&am…

各类系统业务功能架构图整理

一、前言 很多软件系统一直经久不衰&#xff0c;主要这些系统都是一些生产工作经营不可或缺的系统。比如财务系统&#xff0c;商城系统&#xff0c;支付系统&#xff0c;供应链系统&#xff0c;人力资源管理系统&#xff0c;ERP系统等等。这些系统不管大公司还是小公司往往都需…

HTML5.Canvas简介

1. Canvas.getContext getContext(“2d”)是Canvas元素的方法&#xff0c;用于获取一个用于绘制2D图形的绘图上下文对象。在给定的代码中&#xff0c;首先通过getElementById方法获取id为"myCanvas"的Canvas元素&#xff0c;然后使用getContext(“2d”)方法获取该Ca…

信号处理之(文件批处理+小波分解+波形图的生成)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、前期准备工作之数据自动读取二、前期准备工作之信号分解&#xff08;小波分解&#xff09;三、前期准备工作之数据可视化&#xff08;波形图展示&#xff0…

力扣Lc29---- 541. 反转字符串 II(java版)-2024年4月06日

1.题目描述 2.知识点 &#xff08;1&#xff09;执行步骤如下&#xff1a; 初始化 s “abcdefg” 和 k 2 将字符串分割成长度为 2k 4 的块。 对每个块中的前 k 2 个字符进行反转。 执行过程 1&#xff09;第一次循环&#xff08;i 0&#xff09; start 0 end Math.min(0…

RobotFramework测试框架(12)--第三方库

Library 关于射频指南 |机器人框架 (robotframework.org) 使用RF需要使用Library&#xff0c;常用的第三方库如下&#xff1a; 在web浏览器中进行web应用程序测试可以使用的库是 Selenium Library 在内部使用流行的 Selenium 工具的 Web 测试库Browser Library 由 Playwri…

JavaWeb前端基础(HTML CSS JavaScript)

本文用于检验学习效果&#xff0c;忘记知识就去文末的链接复习 1. HTML 1.1 HTML基础 结构 头<head>身体<body> 内容 图片<img>段落<p>图标<link> 标签 单标签双标签 常用标签 div&#xff1a;分割块span&#xff1a;只占需要的大小p&…

【C++】背包问题

目录 背包问题01 背包背包不装满问题背包必须满问题 完全背包 背包问题 背包问题属于动态规划的一类题型 01 背包 背包不装满问题 背包必须满问题 #include <iostream> using namespace std; const int N 1010; #include <vector> int main() {int n , V;int v[…

【深度学习】从基础原理到未来挑战的全面探索

深度学习的基本原理 深度学习&#xff0c;一种模拟人脑分析和处理数据的机器学习技术&#xff0c;已成为人工智能研究中最令人兴奋的进展之一。其核心在于构建和训练神经网络&#xff0c;这些网络由多个层次组成&#xff0c;每一层都能从输入数据中提取并转换特征。随着数据层层…