vs环境下C++dll生成和使用(基础篇)

2023-05-16

动态库和静态库:

动态库:全名动态链接库,用于将你的函数封装,让别人只能调用,不能看你的实现代码。由引入库和dll组成:引入库包含导出的函数和变量名,dll包含实际的函数和数据,运行时加载访问dll文件。 
Windows API中的所有函数都封装在dll里面,最重要的三个:

  • Kernel32.dll:包含管理内存、进程和线程的各个函数。
  • User32.dll:包含用于执行用户界面任务,如窗口和消息机制。
  • GDI32.dll:包含用于画图和显示文本的各个函数。

    静态库:函数和数据被编译进一个二进制文件(lib),编译时,链接器会复制并和其他模块组合,形成可执行文件。适合小型程序,不然可执行文件太大,而且每次修改都要重新编译。

动态库的好处:

  • 可以用多种语言编写,适合跨平台。
  • 提供二次开发平台,封装好底层库,由二次开发衍生出多种产品。
  • 节约磁盘空间和内存。同时运行多个程序,可以调用一个dll。

生成动态库:

先说win32封装函数: 
1.新建win32控制台空项目。 
2.添加dllMain.cpp,加入dll的主函数: 
我也是百度的,具体变量什么意思再查吧,反正每个都要有这个主函数。

#include <Windows.h>

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  // handle to DLL module
    DWORD fdwReason,     // reason for calling function
    LPVOID lpReserved )  // reserved
{
    // Perform actions based on the reason for calling.
    switch( fdwReason ) 
    { 
    case DLL_PROCESS_ATTACH:
        // Initialize once for each new process.
        // Return FALSE to fail DLL load.
        break;

    case DLL_THREAD_ATTACH:
        // Do thread-specific initialization.
        break;

    case DLL_THREAD_DETACH:
        // Do thread-specific cleanup.
        break;

    case DLL_PROCESS_DETACH:
        // Perform any necessary cleanup.
        break;
    }
    return TRUE;  // Successful DLL_PROCESS_ATTACH.
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

3.添加声明文件MyDll.h

//每个函数前面都需要加,C和C++看你具体的编译环境,一般选C比较通用。
extern "C" _declspec(dllexport) int Sum(int a,int b);
extern "C++" _declspec(dllexport) int Sum2(int a,int b);

///也可以/
#ifndef MYDll_H_
#define MYDll_H_

#ifdef MYDLL
#define MYDLL extern "C" _declspec(dllimport) 
#else
#define MYDLL extern "C" _declspec(dllexport) 
#endif

MYDLL int Sum(int a,int b);

#endif  //#ifndef MYDll_H_
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

最后编译就生成了dll和lib。注意,并不能运行,这只是个链接库。

dll的调用:

使用dll前首先要只要里面有啥,要么将声明文件一起给,要么写好文档,要么用工具查。系统cmd和vs的bin目录下都可以查,具体用法自行百度吧。 
调用的方法有两种,隐式和显示。 
隐式需要.h,.lib,.dll三件套,然后: 
项目->属性->配置属性->VC++ 目录-> 在“包含目录”里添加头文件xxxdll.h所在的目录 
项目->属性->配置属性->VC++ 目录-> 在“库目录”里添加头文件xxx.lib所在的目录 
项目->属性->配置属性->链接器->输入-> 在“附加依赖项”里添加“xxx.lib”(若有多个 lib 则以空格隔开) 
最后需要调用的时候包含对应dll.h头文件就好了,很方便。和调用本地方法一样。

还有一种隐式调用:

#pragma comment(lib,"cdll.lib") //路径注意要对
extern "C" _declspec(dllimport) int addfun(int a,int b);//等于包含头文件
  • 1
  • 2

显示调用:适合少量调用。

typedef double (*pAdd)(double a, double b); 
typedef double (*pSubtract)(double a, double b);

HMODULE hDLL = LoadLibrary("testdll.dll"); //加载dll文件
if(hDLL != NULL) 
{ 
        pAdd fp1 = pAdd(GetProcAddress(hDLL, MAKEINTRESOURCE(1))); //得到dll中的第一个函数 
        if(fp1 != NULL) 
        {
            cout<<fp1(2.5, 5.5)<<endl;
        }
        else 
        {  
            cout<<"Cannot Find Function "<<"add"<<endl;  
        }  

        pAdd addfun = (pAdd)GetProcAddress(hDLL, TEXT("addfun"));//直接使用原工程函数名
        FreeLibrary(hDLL);


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

vs环境下C++dll生成和使用(基础篇) 的相关文章

  • C语言中指针的初始化和赋值

    1 指针的初始化 指针初始化时 xff0c 61 的右操作数必须为内存中数据的地址 xff0c 不可以是变量 xff0c 也不可以直接用整型地址值 但是int p 61 0 除外 xff0c 该语句表示指针为空 此时 xff0c p只是表示
  • Aspose.Cells使用总结大全

    使用到 Aspose Cells 插件 xff0c 整理一下 一 xff1a 新建解决方案 xff0c 目录如下 目录说明 xff1a Program cs 入口类 ExcelGenerator cs Aspose Cells 操作类 As
  • C#图像处理基础概念知识

    图像是人类获取和交换信息的主要来源 xff0c 因此 xff0c 图像处理的应用领域必然涉及到人类生活和工作的方方面面 随着人类活动范围的不断扩大 xff0c 图像处理的应用领域也将随之不断扩大 xff08 1 xff09 航天和航空技术方
  • c#中字节数组byte[]、图片image、流stream,字符串string、内存流MemoryStream、文件file,之间的转换

    字节数组byte 与图片image之间的转化 字节数组转换成图片 span class hljs keyword style color 0088 public span span class hljs keyword style colo
  • C/C++ 文件操作之CreateFile、ReadFile和WriteFile

    1 CreateFile 这个函数的功能是创建或者打开一个文件或者I O设备 xff0c 通常使用的I O形式有文件 文件流 目录 物理磁盘 卷 终端流等 如执行成功 xff0c 则返回文件句柄 INVALID HANDLE VALUE 表
  • String到底是值类型还是引用类型(C#)

    MSDN 中明确指出 String 是引用类型而不是值类型 xff0c 但 String 表面上用起来却像是值类型 xff0c 这又是什么原因呢 xff1f 首先从下面这个例子入手 xff1a span class hljs comment
  • VS2013 MFC基于对话框编程(创建工程)

    一 新建MFC项目 选择 xff1a 基于对话框MFC的使用 xff1a 在共享DLL中使用MFC xff08 程序运行需要dll xff09 在静态库中使用MFC xff08 程序较大 xff0c 运行时不需要dll xff09 设置MF
  • MFC中画直线和曲线的几种方法

    一 画直线 要想在MFC中画出有颜色的线条 xff0c 首先就要设置DC的画笔 xff0c 我们可以按如下方法来设置画笔 xff1a 第一步 xff1a 在View类中添加一个COLORREF类型的数据成员m Color xff08 用来保
  • C++函数的传入参数是指针的指针(**)的详解

    要修改变量的值 xff0c 需要使用变量类型的指针作为参数或者变量的引用 如果变量是一般类型的变量 xff0c 例如int xff0c 则需要使用int 类型的指针类型int 作为参数或者int的引用类型int amp 但是如果变量类型是指
  • 零基础学习WinCE开发

    在接触WinCE时候的基础 xff1a 软件语言基础 xff1a C C 43 43 C 我不是计算机专业的 xff0c 所以这些语言基础也是比较业余的 经验不丰富 xff0c 遇到问题就是查MSDN或者到网上查找相关解决方案即可 xff0
  • SD-WAN为什么备受欢迎?

    SD WAN即软件定义广域网 xff0c 通过集中控制器 xff0c 将广阔地理范围内的计算机 云服务 数据中心集中起来统一管理 比较多地用于企业组网场景 xff0c 那么为什SD WAN如此受欢迎呢 xff1f 近年来 xff0c 企业的
  • C#实现缩放和剪裁图片的方法示例

    C 实现缩放和剪裁图片的方法 分享给大家供大家参考 xff0c 具体如下 xff1a 1 2 3 4 5 6 7 8 9 10 11
  • 虚拟内存解疑

    虚拟内存别称 虚拟存储器 xff08 Virtual Memory xff09 电脑 中所运行的 程序均需经由 内存执行 xff0c 若执行的程序占用内存很大或很多 xff0c 则会导致内存消耗殆尽 为解决该问题 xff0c Windows
  • windows内存结构概述

    13 1 Windows的虚拟地址空间安排 13 1 1虚拟地址空间的分区 xff08 即虚拟地址空间布局 xff09 进程的地址空间划分 分区 x86 32位 Windows 3GB用户模式下的x86 32位Windows X64 64位
  • 变量名和内存地址及符号表

    1 变量名是给编译器看的 xff0c 编译器根据变量是局部还是全局分配内存地址或栈空间 xff0c 所谓的变量名在内存中不存在 xff0c 操作时转换成地址数存放在寄存器中了 其实可以理解为是符号表起到了连接作用 2 符号表 xff08 此
  • C/C++编译和链接过程详解 概述 (重定向表,导出符号表,未解决符号表)

    详解link 有 些人写C C 43 43 以下假定为C 43 43 程序 xff0c 对unresolved external link或者duplicated external simbol的错误信息不知所措 xff08 因为这样的错误
  • 编译器构造概述(详细)

    一 编译器简介 前面谈到静态链接器构造的基本流程 xff0c 最后提到所构造的链接器若要能正常工作的前提是需要构造一个能生成符合链接器输入文件格式的编译器 xff0c 本文构造一个符合这种具体格式要求编译器 但是编译器的直接编译的结果一般是
  • nm命令中符号类型详解

    nm命令介绍的很多 xff0c 但大多不介绍其函数符号标志的含义 最近在调试动态库时常用到 xff0c 其中用的最多的用法 nm A grep aaa c 43 43 filt A 为了显示文件 xff0c c 43 43 filt转换为可
  • 电脑怎样执行编程语言的?

    链接 xff1a https www zhihu com question 29227521 answer 154819061 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非商业转载请注明出处 这个问题
  • 汇编中的标号概念

    地址标号和数据标号 地址标号 1 assume cs code 2 code segment 3 a db 1 2 3 4 5 6 7 8 4 b dw 0 5 start mov si offset a 6 mov bx offset b

随机推荐

  • 汇编语言不带冒号标号的用法

    汇编语言中 xff0c 有一种编程方法 xff1a 直接定址表 这种方法和高级语言 xff0c C语言中的数组有类似的思想 xff0c 就是将参数编排在一起 xff0c 然后通过数组名的调用 xff0c 得到需要的数值 汇编语言中 xff0
  • 实战录 | 基于openflow协议的抓包分析

    实战录 导语 云端卫士 实战录 栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧 xff0c 希望对于关注我们的朋友有所裨益 本期分享人为云端卫士安全SDN工程师宋飞虎 xff0c 将带来基于openflow协议的抓包分析 一 什么是
  • 汇编中的标号

    当程序中要跳转到另一位置时 xff0c 需要有一个标识来指示新的位置 xff0c 这就是标号 xff0c 通过在目标地址的前面放上一个标号 xff0c 可以在指令中使用标号来代替直接使用地址 使用变量是任何编程语言都要遇到的工作 变量是计算
  • win32常用的汇编指令和寄存器

    通用寄存器 EAX 累加 Accumulator 寄存器 AX AH AL 常用于乘 除法和函数返回值 EBX 基址 Base 寄存器 BX BH BL 常做内存数据的指针 或者说常以它为基址来访问内存 ECX 计数器 Counter 寄存
  • win32汇编寄存器汇总

    32位CPU所含有的寄存器有 xff1a 4个数据寄存器 EAX EBX ECX和EDX 2个变址和指针寄存器 ESI和EDI 2个指针寄存器 ESP和EBP 6个段寄存器 ES CS SS DS FS和GS 1个指令指针寄存器 EIP 1
  • 汇编指令ebp与esp的关系与作用

    可以看到 xff0c 初始情况下 xff0c ebp此时值为0012FEDC xff0c 也就是栈帧的地址 xff0c 而栈顶地址esp值为0012FDFC 可以看到两个值有一定的关系 而 帧指针 的地址较高 然后我们让它执行前两句 xff
  • win32 汇编基础概念整理

    一 关于寄存器 寄存器有EAX EBX ECX EDX EDI ESI ESP EBP等 xff0c 似乎IP也是寄存器 xff0c 但只有在CALL RET在中会默认使用它 xff0c 其它情况很少使用到 xff0c 暂时可以不用理会 E
  • 汇编中的寻址方式

    存储器 存储器 xff08 Memory xff09 是现代信息技术中用于保存信息的记忆设备 其概念很广 xff0c 有很多层次 xff0c 在数字系统中 xff0c 只要能保存二进制数据的都可以是存储器 xff1b 在集成电路中 xff0
  • x86的32位汇编快速入门

    本文描述基本的32位X86汇编语言的一个子集 xff0c 其中涉及汇编语言的最核心部分 xff0c 包括寄存器结构 xff0c 数据表示 xff0c 基本的操作指令 xff08 包括数据传送指令 逻辑计算指令 算数运算指令 xff09 xf
  • 80x86汇编指令详解

    80x86指令系统 xff0c 指令按功能可分为以下七个部分 1 数据传送指令 2 算术运算指令 3 逻辑运算指令 4 串操作指令 5 控制转移指令 6 处理器控制指令 7 保护方式指令 3 3 1数据传送指令 数据传送指令包括 xff1a
  • 汇编中addr和offset

    汇编中addr和offset的异同点 xff01 xff01 xff01 一 相同点 1 addr 和 offset 操作符都是获得操作数的偏移地址 xff1b 2 addr 和 offset 的处理都是先检查处理的是全局还是局部变量 xf
  • 汇编语言,数据段中,标号前面加不加offset有什么区别?

    data segment string db 40h dup 0 string 1 db 39 Input characters 39 0dh 39 39 data ends 那么 xff0c mov bx string 和 mov bx
  • SD-WAN如何推动企业上云

    企业上云是指企业将其业务系统 应用程序 数据等资源迁移到云端 xff08 云服务提供商的数据中心 xff09 xff0c 以实现更高效 灵活 安全 可靠的信息化运营和服务 麦肯锡公司发布了名为 企业上云2 0 xff1a 加速数字化转型 x
  • nvm常用命令,配置镜像

    1 配置镜像 阿里云 nvm npm mirror https npmmirror com mirrors npm nvm node mirror https npmmirror com mirrors node 腾讯云 nvm npm m
  • 汇编语言中MOV和OFFSET指令的两个问题?

    xff08 1 xff09 往段寄存器送段地址时要写成 MOV AX DATA MOV DS AX 不能写成 MOV DS DATA 这是为什么 xff1f 有人说由于段寄存只能进行16位的读写 xff0c 因此需要用ax来倒一下 xff0
  • C++动态链接库的制作

    输入函式 declspec dllimport 与输出函式 declspec dllexport 有什么区别呢 xff1f 我知道他们不同 xff0c 但差别在哪呢 我用的全是 declspec dllexport xff0c declsp
  • C#调用C++函数来与串口通信

    前些日子帮朋友写个小软件 xff0c 要求用C 来实现主程序 xff0c 主要的功能是与一些通信设备打交道 xff0c 当然就是通过串口了 xff0c 以十进制发送和读取串口 的数据 xff0c 考虑到C 调用API并没有C 43 43 来
  • c++获取系统错误提示!getLastError()

    void showError LPVOID lpMsgBuf FormatMessage FORMAT MESSAGE ALLOCATE BUFFER FORMAT MESSAGE FROM SYSTEM FORMAT MESSAGE IG
  • c++串口操作

    0 前言 做串口方面的程序 xff0c 使用CreateFile打开串口通信端口 在对串口操作之前 xff0c 需要首先打开串口 使用C 43 43 进行串口编程 xff0c 如果采用VS开发 xff0c 则可以直接借助于串口通信控件来操作
  • vs环境下C++dll生成和使用(基础篇)

    动态库和静态库 xff1a 动态库 xff1a 全名动态链接库 xff0c 用于将你的函数封装 xff0c 让别人只能调用 xff0c 不能看你的实现代码 由引入库和dll组成 xff1a 引入库包含导出的函数和变量名 xff0c dll包