C++ || dll的封装、显式调用和隐式调用(函数 / 类)

【C++】封装 调用 dll / lib 笔记用,有错误欢迎指出,谢谢。 一、lib文件 静态链接库文件,需要在主程序编译时一起编译生成exe。 二、dll文件 动态链接库文件,可在程序运行时才调用,无需编译时一起打包。 三、封装和调用 lib/dll文件 1、lib 文件的封装和 dll 类似,在导出时选则即可。 2、打包生成 lib 文件时,只会生成 .lib(大小较大)文件。 调用 .lib,需要 .h + .lib;因为有头文件,调用时正常使用头文件中函数即可。 3、打包生成 dll 文件时,会生成 .lib(大小较小). 阅读详情

一、文件的介绍

1. 头文件:存放函数声明
2. dll文件:当中存放着函数的定义。(Dynamic Link Library)文件为动态链接库文件,又称为“应用程序扩展”。
2. lib文件:(1) 里面没有代码,这种是在调用dll时,起链接作用,告知在哪个dll里面找到该头文件的函数
                   (2) 里面有函数实现的代码(自己基本无使用无了解)

 

二、将函数封装成dll

举例子说明。创建一个项目,实现加的算法

funct.h

int Sum(int a, int b);
int Max(int a, int b);
int Min(int a, int b);

funct.cpp

int Sum(int a, int b)
{
    return a+b;
}
int Max(int a, int b)
{
    if (a >= b)return a;
    else
	return b;
}
int Min(int a, int b)
{
    if (a >= b)return b;
    else
	return a;

void main()
{
    int a=5; int b=5;
    int c = Sum(a,b)
}

将上面的代码修改为

funct.h

extern "C" _declspec(dllexport)int Sum(int a, int b);
extern "C" _declspec(dllexport)int Min(int a, int b);
extern "C" _declspec(dllexport)int Max(int a, int b);

funct.cpp

extern "C" _declspec(dllexport)int Sum(int a, int b)
{
	return a + b;
}
extern "C" _declspec(dllexport)int Min(int a, int b)
{
    if (a >= b)return b;
    else
	return a;
extern "C" _declspec(dllexport)int Max(int a, int b)
{
    if (a <= b)return b;
    else
	return a;

然后将属性>>常规>>配置类型 修改为dll即可。这样即可生成dll和lib文件。

三、C++ dll的调用

分两种:隐式链接、显示链接。
windows系统下遵循的搜索顺序来定位dll:1.包含EXE的文件目录 2.进程的当前工作目录 3.windows系统目录 4. windows目录 5.列在Path环境变量中的一系列目录

1. 隐式链接

隐式链接是在程序执行的时候,就将DLL文件加载到应用程序中。实现方法:将导入函数关键字_declspec(dllimport) funct,然后在配置中设置lib和dll的路径。上面封装的dll的调用:

Dlltest.h

//#pragma conment(lib, "funct.lib")  // 和属性里面配置一个效果
extern "C"_declspec(dllimport) int Sum(int a, int b);

Dlltest.cpp

#include "Testdll.h"
void mian()
{
    int a;
    a = Sum(5,5);
}

然后把需要的dll和lib在配置里面进行相应的链接即可。

2.显示链接

显示链接是应用程序在执行过程中随时可以添加DLL文件,也可以随时卸载DLL文件,这是隐式链接无法做到的,所以显示链接具有更好的灵活性,对于解释性言语更为合适。不过使用显示链接要麻烦一些。
在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显示的将自己所做的动态链接库调用进来。在应用程序退出之前,应用FreeLibrary或MFC提供的AfxFreeLibrary释放的动态链接库。例子:

#include <windows.h>  
#include <cstdio>  
void main(void)  
{  
typedef int(*pMax)(int a,int b);  
HINSTANCE hDLL;  
PMax Max  
HDLL=LoadLibrary("MyDll.dll");//加载动态链接库MyDll.dll文件;  
Max=(pMax)GetProcAddress(hDLL,"Max");  
A=Max(5,8);  
Printf("比较的结果为%d\n",a);  
FreeLibrary(hDLL);//卸载MyDll.dll文件;  
} 

使用显式链接应用程序编译时不需要使用相应的Lib文件

四、类的封装

以上是对函数封装的讲解与举例,对于类的封装区别不大,就是在.h文件中有所差异

class __declspec(dllexport) TransferFunction
{
      ...
}

其他流程一样。

 

 

 

 

# C++的DLL封装以及调用(类、VS2019) 因工作需要,对C++部分代码进行DLL封装。涉及到几个问题: 拿到手的是已经完成的项目,要对其中部分代码进行DLL封装,代码主要是类内的成员函数。所以在不改变项目其他部分的情况下,只对成员函数的具体实现封装。这里涉及到在某一个类内对其他类的调用。 鉴于对DLL的显式调用有些繁琐,故采用隐式调用,隐式调用我知道的有两种方法,我只用了一种,出于可移植性考虑。 DLL的创建 这里直接在新建时选择创建动态链接库即可。 第一步:新建自己的 .h 和 .cpp 文件。格式大致如下: 其中__declspec(dl 阅读详情

相关推荐

【C++】多个类的DLL封装及调用

网上大多是将函数封装成dll的教程,类的封装也是基本相似的。 创建DLL 在VS2010中新建一个win32->dll工程。如我建立的工程名为FaceDLL 添加facedll.h的头文件(里面定义dll的接口,调用时会用到) #pragma once #ifdef FaceLIBDLL #define FACEAPI _declspec(dllexport) #else #defin

小魏的修行路 3万+

C++ dll库的封装及调用

进行dll库封装时的自我笔记,以便自己时常回顾。 右击工程,点击属性,打开属性界面,在常规一栏中将配置类型从.exe改为.dll 1.将main函数改为dllmain函数 将main函数里程序去掉,换上定义dll应用程序的入口点的程序,如下: //dllmain.cpp:定义DLL应用程序的入口点 #include "stdafx.h" BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserve

weixin_42258743的博客 9523

简单实现基于C++的COM组件创建与DLL封装

简单实现基于C++的COM组件创建与DLL封装,包括组件、COM、COM组件、DLL等基本概念与关系,使用C++进行COM组件创建与DLL封装调用等的简单实现。

the_best_me_andu的博客 4735

C++ 多个类的DLL封装以及隐式链接和显式链接

将OpenCL和OpenCV一些简单的方法封装成DLL,具体OpenCL和OpenCV的配置方法可以参考本人的博客。 VS2015下安装与编译OpenCV源码并在VS2015下配置OpenCV环境 VS上运行CUDA,并在NVDIA显卡安装的CUDA中运行OpenCL 1.  DLL封装 (1)  创建DLL工程 新建一个Win32控制台应用程序,项目名称为buildopencldll,选择

吾王★Excalibur 1171

将c++封装成dll库及vs调用dll

以下内容是如何让将vs中写的c++函数封装成dll 1.在vs2013中新建一个项目,如图所示, 2.main.cpp中复制以下内容 // dllmain.cpp : 定义 DLL 应用程序的入口点。   #include   BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVO

qq_32039433的博客 1万+

C++调用DLL完全指南:从原理到实战,解决隐式与显式链接难题

动态链接库(DLL)是Windows平台实现代码模块化与复用的核心技术,其本质在于将函数库与主程序分离,实现运行时动态加载。理解其工作原理需掌握两种核心调用方式:隐式链接通过导入库在编译时建立关联,简化调用但依赖严格;显式链接则借助LoadLibrary和GetProcAddress在运行时动态加载,提升灵活性。在C++开发中,正确处理函数导出、内存管理和ABI兼容性是保障稳定性的关键,尤其需关注extern "C"对名字修饰的消除及跨编译器兼容性挑战。本文聚焦C++与DLL交互的工程实践,通过对比两种链接

weixin_33404102的博客 332

C/C++ dll的隐式调用与显式调用

1.头文件、lib文件、dll文件 头文件:存放函数声明 dll文件:存放函数的定义,动态链接库文件Dynamic Link Library,运行时使用 lib文件:具体分静态编译与动态编译,编译时使用 静态编译 静态编译将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序。 静态编译的优点是编写出来的程序不需要调用DLL和载入函数,直接可以当成程序的一部分来使用。 静态编译的缺点也是显而易见的,使用静态编译的程序体积会比动态编译大,原因是函数的实现被嵌入为程序代码的一部分。 动态

zyb的博客 1万+

WIN10DLL的封装——vs2019(类的封装和调用)

本文主要参考了这篇博文 VS2019 C++接口类的封装与调用DLL+嵌套类+BP气温预测_我不会起名字的博客-优快云博客 本文介绍了vs封装类的dll的方法,经过本人实测可以跑通 PS:之前的博文提到的问题“这两种方法都是 dll 封装函数的,没有找到 dll封装类的;需要封装类的场景很少吗,求问?” 结合本文正好可以作为对比。 ——————————————————————————————————————————— PS2:C++接口封装及DLL中使用头文件实例_一行一生-优快云博客_c.

weixin_39323526的博客 2381

C++编写一个继承类,封装为DLL并隐式调用

动态链接库(dynamic-link library)(DLL) 是一个包含函数和数据的模块,它可以被其他模块(应用或 DLL)使用。使用 DLL 也有助于减少内存占用,因为即便每个程序需要拥有属于自己的 DLL 数据的副本,这些程序共享了 DLL 的代码。

m0_58242248的博客 2324

(C++实例)在VS中封装DLL并调用

dll通常包含的是多个程序都能用到的代码和数据,在大多数情况下可以理解为对多个通用函数进行封装,所以生成dll的代码是没有main函数的,只有通用函数的声明和定义。

qq_43199575的博客 2159

C++多类DLL封装与隐式/显式链接调用实战

回望这场旅程,我们从最基本的出发,穿越了类设计、接口抽象、链接机制、调试部署的重重关卡。你会发现,DLL从来不只是一个技术点,它是模块化思维的具象化体现。当你学会用接口隔离变化,用工厂封装创建,用清单锁定依赖,你就已经掌握了构建大型系统的底层心法。未来的微服务、插件架构、热更新系统,不过是这套思想在更高维度的延伸罢了。所以,别再把DLL当成简单的代码复用工具了。把它当作你架构蓝图上的第一块基石,用心雕琢,因为它承载的,是一个可进化、可信赖、可持续的软件生命体。🌱。

weixin_35749545的博客 800

【C++】显示与隐式加载dll的使用与区别

【C++】显示与隐式加载dll的使用与区别

wangnaisheng的专栏 1346

VS2022错误列表高效处理:从复制到Excel表格的完整指南

本文详细介绍了在Visual Studio 2022中高效处理错误列表的实用技巧,重点讲解了如何将错误信息一键复制并粘贴到Excel表格中。通过基础操作、自定义视图、筛选功能及常见问题解决方案,帮助开发者将杂乱的编译错误整理成清晰、可排序、可筛选的数据表,极大提升了团队协作、错误分析和项目管理的效率。

weixin_28837817的博客 359

Matlab函数封装为DLL供Cpp调用

Matlab函数封装为DLL供Cpp调用 文章目录Matlab函数封装为DLL供Cpp调用Ⅰ目标Ⅱ 学习Ⅲ 实现1. Matlab 函数封装为DLL2. vs2015中C++调用Matlab DLL步骤Ⅳ 问题解决Ⅴ 后续可能有用信息 Ⅰ目标 Matlab函数封装为DLL,供Cpp调用 Matlab函数为类函数,matlab函数功能复杂 Ⅱ 学习 整体流程: ①**(整体学习)**浅析将matlab函数编译成dll供Cpp调用的方法 http://blog.sina.com.cn/s/blog_9

xiao2yang1998的博客 2957

h5支付不能打开支付宝 ios_iOS支付宝H5支付无法返回APP解决方案

本文前大段在讲楼主是如何解决这个问题的,以及中间遇到的麻烦。赶时间的同学可以直接看最后的 最终解决方案。在讨论之前,我们先看看官方文档上的一句话:注意:在iOS系统中,唤起支付宝App支付完成后,不会自动回到浏览器或商户APP。用户可手工切回到浏览器或商户APP;支付宝H5收银台会自动跳转回商户return_url指定的页面。what? 官方直接跟我们说GG了?楼主不甘心,还是想尝试一下。借鉴之前...

weixin_39864101的博客 854

小样本物体检测

Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector 关键:提出了一个小样本数据集:数据集 步骤: 提取support img为一过滤特征 使用support img的特征来过滤query img,最后将过滤后的特征输入RPN网络中 RPN网络层的输出,会进行多头判断,使用全局信息检测,使用局部信息检测,一对多检测 Attention-Based Region Proposal Network Increme

qq_21157073的博客 5266

C++多类DLL封装与调用实战:从隐式链接到显式加载

动态链接库(DLL)是Windows平台实现代码复用和模块化开发的核心技术。其原理在于将可执行代码封装为独立的二进制模块,主程序在运行时动态链接并调用其中的函数,从而提升软件的可维护性和资源利用率。在C++工程实践中,DLL的技术价值尤为突出,它不仅能有效解耦大型项目、支持插件化架构,还能显著减少内存占用。然而,当涉及多类封装时,开发者常面临跨模块内存管理、二进制兼容性等挑战。本文通过工厂模式和纯虚接口等设计模式,系统讲解了如何安全地导出C++类,并对比了隐式链接与显式链接两种调用方式的应用场景与实现细节,

weixin_33600816的博客 314

告别机床‘卡顿’!用C语言在STM32上实现连续小线段速度前瞻(附开源代码)

本文详细介绍了如何在STM32上使用C语言实现工业级连续小线段速度前瞻控制器,解决机床运动控制中的卡顿问题。通过轻量级算法框架设计和混合精度计算策略,显著提升加工效率和表面质量。文章包含开源代码和实战案例,帮助开发者快速掌握速度前瞻规划算法在嵌入式系统中的应用。

weixin_42571738的博客 186

VS(visual studio) C++ 封装dll,以及其隐式调用与显式调用(静态\动态)

DLL介绍 DLL(动态链接库,Dynamic Link Library)是一种可执行文件,它包含可以在其他程序中调用的函数和数据。他是Windows操作系统中的一个重要概念,用于代码共享和模块化。 特点# 代码共享:多个程序可以同时使用同一个DLL文件,而不需要将其代码编译到每个程序中。这样可以节省磁盘空间和内存,并且可以简化程序的更新和维护。 运行时链接:与静态链接库(.lib文件)不同,...

weixin_40602591的博客 1135

将任意文件转换为Pcap网络数据包传输

一款实用的工具用于将任意文件转换为pcap网络数据包

村中少年的专栏 3188

基于Python的新闻聚合与推荐系统:抓取多新闻网站内容并根据用户兴趣进行个性化推荐

本文介绍了如何使用Python构建一个新闻聚合与推荐系统,涵盖了从新闻数据抓取、用户兴趣建模到推荐算法实现的全过程。通过爬虫技术抓取新闻网站内容,使用TF-IDF、Word2Vec等算法进行内容分析,并通过推荐算法向用户推送个性化的新闻,最终帮助用户快速获取自己感兴趣的信息。你可以根据具体需求,进一步扩展和优化系统。例如,加入更多的推荐算法、优化爬虫的抓取效率、增强前端展示的互动性等。通过本文的指导,您应该能够构建一个完整的新闻聚合与推荐系统,并为用户提供个性化的新闻推荐服务。

2201_76125261的博客 1514

[C++][DLL][类]关于DLL封装和DLL类的使用等问题

这里写自定义目录标题一、DLL的封装1、描述2、实现二、DLL类的使用1、描述2、实现三、踩过的坑1、方法无法调用问题2、类无法new以及类中方法无法调用3、没有生成lib文件4、预编译头问题 一、DLL的封装 1、描述 dll为动态库,他有非常好的封装性,也能保护源码, 相较于lib静态库,它拥有低内存的特性 并且调用分为两类,即显式调用和隐式调用 2、实现 1、首先在VS中创建动态库dll工程。 2、工程中拥有 pch.h 和 pch.cpp 文件 ,他们的名称可以修改,不过请把所有相关文件中的内

qq_31103801的博客 4118

Sigrity System Explorer ViaWizard模式进行过孔建模和仿真分析操作指导

点击TVac_lower tdvac_lower,自动跳转到2D时域曲线,查看最小低电平穿过VIL(ac)max电压的延时,结果如下。点击TVac_high tdvac_high,自动跳转到2D时域曲线,查看最小高电平穿过VIH(ac)min电压的延时,结果如下。点击max Vix_Rise,自动跳转到2D时域曲线,查看上升边PN交叉点与参考电压VREF(dc)的偏差,结果如下。Threshold:阈值,软件自带3个模板,default,Tr01,Tr02,本例选择Default。

weixin_54787054的博客 571

C++类导出及显式调用方法

C++ 类导出及其显式调用 1. 概述 本文介绍一种利用C++面向对象的继承特性与多态特性对类进行导出为动态链接库DLL及显式调用,该种导出方法可以减少在调用时对头文件的依赖,更好地隐藏信息。本文由两部分组成,即类的导出和DLL的显式调用,以算法类ALG的封装及调用进行讲解说明。 2. C++ 类的导出 C++ 类的导出由三部分组成,即父类ALG的申明、子类ScratchDetectALG的声明及实现、子类ScratchDetectALG的导出 2.1 父类ALG的申明 根据实际接口需求,申明ALG的公有

yezhaobin的博客 4078

ROCm rocr-libhsakmt分析系列1-2:多GPU跨卡VRAM访问机制分析

本文基于ROCr-Runtime的libhsakmt库源码,深入分析了多GPU系统中跨设备内存访问的实现机制。主要内容包括: 实现流程概述:通过P2P拓扑发现、统一虚拟地址空间、页表映射和硬件转发四个步骤,实现零拷贝的跨GPU内存访问。

图形/计算GPU的驱动与虚拟化技术分享园地 2505

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

HoloLens开发——C++ DLL封装及在win32、Unity、AR眼镜中调用情况

 一、C++ Dll基础了解动态链接库(dll)比较好的介绍在孙鑫《VC++深入详解》第十九章动态链接库中有详细介绍。主要涉及以下问题:1.静态链接库与动态链接库的区别https://blog.youkuaiyun.com/zang141588761/article/details/50501914①静态链接库编译的时候加载;②动态链接库运行的时候加载。 2.dll的显式调用和隐式调用https://blog...

haitianyunlan的博客 2290

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: CNN基础知识 || softmax与交叉熵
下一篇: 论文阅读 || 图像分类系列 —— VGG详解
magic_ll
博客等级 码龄9年 3万+粉丝 158原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值