首页 > 编程语言 >Win32编程之动态库(七)

Win32编程之动态库(七)

时间:2023-09-16 11:33:36浏览次数:41  
标签:函数 int 编程 dll Win32 CPPdll 动态 链接

一、动态库的特点

  • 运行时独立存在
  • 源码不会链接到执行程序
  • 使用时加载(使用动态库必须使用动态库执行)
  • 与静态库的比较:由于静态库是将代码嵌入到使用程序中,多个程序使用时,会有多份代码,所有代码体积会增大,动态库的代码只需要存在一份,其他程序通过函数地址使用,所以代码体积小;静态库发生变化后,新的代码需要重新链接嵌入到执行程序中,动态库发生变化后,如果库中函数的定义(或地址)未变化,其他使用DLL的程序不需要重新链接

二、动态库的创建

  • 创建动态库项目
  • 添加库程序
  • 库程序导出:提供给使用者库中的函数等信息

1.声明导出

使用_declspec(dllexport)导出函数,注意:动态库编译连接后,也很会有LIB文件,是作为动态库函数映射使用,与静态库不完全相同。

库头文件:

#pragma once

_declspec(dllexport) int CPPdll_add(int add1, int add2);
_declspec(dllexport) int CPPdll_sub(int sub1, int sub2);
_declspec(dllexport) int CPPdll_mul(int mul1, int mul2);

库源文件:

#include "dllmain.h"

int CPPdll_add(int add1, int add2) {
	return add1 + add2;
}

int CPPdll_sub(int sub1, int sub2) {
	return sub1 - sub2;
}

int CPPdll_mul(int mul1, int mul2) {
	return mul1 * mul2;
}

2.模块定义文件.def

例如:LIBRARY DLLFunc(库),EXPORTS(库导出表),DLL_Mul @1(导出的函数)

三、动态库的使用

 动态库中的lib文件存放着函数名称和每个函数的编号,当运行程序加载dll文件时,会根据lib文件中的编号去dll文件中找到对应的函数名称,从而找到对应的函数地址

1.隐式链接(操作系统负责动态库执行)

(1).头文件和函数原型:可以在函数原型的声明前,增加_declspec(dllimport)

(2).导入动态库的LIB文件

(3).在程序中使用函数

(4).隐式链接的情况,dll文件可以存放的路径:

  • 与执行文件在同一个目录
  • 当前工作目录
  • Windows目录
  • Windows/System32目录
  • Windows/System
  • 环境变量PATH指定目录

示例代码:

#include <iostream>
#include "../CPPDll/dllmain.h"

using namespace std;

//通过链接器到哪去抓取编号和dll文件名("CPPdll.dll")
#pragma comment(lib, "../Debug/CPPdll.lib")

int main() {
	int sum = CPPdll_add(5, 4);
	int sub = CPPdll_sub(5, 4);
	int mul = CPPdll_mul(5, 4);

	cout << "sum:" << sum << endl;
	cout << "sub:" << sub << endl;
	cout << "mul:" << mul << endl;

	return 1;
}

2.显示链接(程序员自己负责动态库的执行)

(1).定义函数指针类型(typedef)

(2).加载动态库:

HMODULE LoadLibrary(
        LPCTSTR lpFileName //动态库文件名或全路径
);返回DLL的示例句柄(HINSTANCE)    

(3).获取函数地址:

FARPROC GetProcAddress(
               HMODUKE hModule, //DLL句柄
               LPCSTR lpPricName //函数名称
);成功返回函数地址        

(4).使用函数

(5).卸载动态库

BOOL FreeLibrary(
         HMODULE hModule //DLL的实例句柄   
);    

  

 

  

 

标签:函数,int,编程,dll,Win32,CPPdll,动态,链接
From: https://www.cnblogs.com/TechNomad/p/17706484.html

相关文章

  • [代码随想录]Day46-动态规划part14
    题目:1143.最长公共子序列思路:主要就是两大情况:text1[i-1]与text2[j-1]相同,text1[i-1]与text2[j-1]不相同如果text1[i-1]与text2[j-1]相同,那么找到了一个公共元素,所以dp[i][j]=dp[i-1][j-1]+1;如果text1[i-1]与text2[j-1]不相同,那就看看......
  • Win32编程之静态库(六)
    一、静态库的特点运行不存在静态库源码被链接到调用程序中目标程序的归档二、C语言静态库1.C静态库的创建创建一个静态库项目添加库程序,源文件使用C文件2.C静态库的使用库路径的设置:可以使用pragma关键字设置;#pragmacomment(lib,"../lib/clib.lib")三、C++语言......
  • 结构化编程
    学习一门技术最好的方式就是阅读官方文档,可以查看MATLAB官方文档流程控制语句和逻辑运算符与大多数编程语言相同,MATLAB有以下流程控制语句:流程控制语句作用if,elseif,else若if语句为真,则执行子句switch,case,otherwise根据switch语句内容判断执行哪个子句while重复执行子句......
  • 《Java编程思想第四版》学习笔记28
    //:PrintFile.java//Shorthandclassforopeninganoutputfile//forhuman-readableoutput.packagecom.bruceeckel.tools;importjava.io.*;publicclassPrintFileextendsPrintStream{publicPrintFile(Stringfilename)throwsIOException{super(n......
  • 【算法进阶课】动态规划笔记
    基环树DP一些基本概念:在一棵树上加一条边,就会构成一个环,环上会挂着一些子树。基环树是只有一个环的仙人掌。如果基环树的边是有向边,环上的点是p1,p2,p3,...则环上的边是p1->p2,p2->p3,...,pn->p1或者全部反过来总之就是环上的边要么全部逆时针要么全部顺时针。对于......
  • MFC动态数组CArray
             ......
  • Python并发编程——IO模型、阻塞IO、非阻塞IO、多路复用、异步IO、IO模型比较、select
    文章目录每日测验一IO模型介绍二阻塞IO(blockingIO)三非阻塞IO(non-blockingIO)四多路复用IO(IOmultiplexing)五异步IO(AsynchronousI/O)六IO模型比较分析七selectors模块网络并发知识点梳理网络并发知识点梳理每日测验简述死锁现象你用过哪些队列阐述进......
  • 如何选择最适合您的AI编程工具
    ChatGPT的广泛应用引发了人工智能应用场景的重大变革和实践的探索。大规模专业模型在垂直领域得到了不断深化和实施。其中,基于大模型的编码AI工具的问世大大降低了开发复杂度,提高了开发人员的工作效率,对初级开发人员尤其有帮助。所以说,面对目前市场上涌现出的众多优秀的AI编程辅......
  • Avalonia 11中动态变更主题和颜色的方法
       首先添加一个这个工具类:usingAvalonia.Controls.ApplicationLifetimes;usingAvalonia.Styling;usingAvalonia.Themes.Fluent;usingAvalonia.Themes.Simple;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSyst......
  • C#桌面应用程序多语言编程
    当我们的软件需要在国外应用时,就需要将软件界面的文字切换成相应国家的语言,这时就需要实现软件界面的多语言,也称为国际化,本篇博客讲的是C#的多语言版本的实现。本篇博客分别讲解如下内容:主窗体的多语言实现自定义窗体的多语言实现自定义控件的多语言实现MessageBox对话框的多语言......