新书推荐:1.2 动态链接库与API

本节必须掌握的知识点:

        kernel32.dll

        user32.dll

        gdi32.dll

动态链接库

最早的软件开发过程,所有的功能实现都是有程序员独立完成的。在这个过程中,我们很快就会发现,有很多常用的功能模块是可以重复利用的,我们将其封装为功能函数。我们将这些功能函数独立编译成统一格式的OBJ目标文件,并存放于一个LIB库文件中。源程序中可以调用这些第三方功能函数,当编译器编译时,暂时将这些第三方功能函数的地址空下,待链接器链接时,在LIB库中查找对应的OBJ功能模块,并将其添加到源代码中,填写空下的函数地址。这就是我们所谓的静态链接库了。

在Windows操作系统中,采用的是另外一种形式的链接库,我们将特定功能的第三方功能函数封装到一个dll形式的库中,我们将其称为动态链接库。动态链接库dll文件通常保存在“C:\Windows\System32”系统目录下。源程序中同样直接调用第三方功能函数(需要头文件声明函数原型)。编译器编译链接时,会将第三方功能函数所在的dll动态链接库名称、函数名称、函数序号以及函数相对地址记录到一个PE文件(Windows指定的exe二进制格式文件)的节区。待编译后的EXE文件由操作系统加载到低2GB空间时,加载dll动态链接库(除了系统链接库之外,也可以是自定义的dll动态链接库)。此时,应用程序和dll动态链接库同处于一个4GB虚拟空间内,然后根据所引用的函数名或序号在动态链接库内查找该函数真实的地址,替换函数地址表内的相对地址,这样形成一个完整的程序就可以正常运行了。

为何要采用动态链接库这种形式呢?随着应用程序的功能越来越多,所引用的库函数也变得越来越多,如果继续采用静态链接库的形式,无疑会大大增加程序的体积,基于有限的存储空间和程序加载效率的考虑,设计动态链接库的形式可以很好地解决上述问题。动态链接库的缺点是对操作系统环境的依赖。

API函数

对于程序员来说,Windows操作系统的功能完全由API(Application Programming Interface首字母的缩写,意思为程序之间的接口)来定义。API涵盖了应用程序所能调用的全部操作系统函数,以及相关的数据类型和结构。在Windows中,API还隐含了一种特殊的程序结构,我们将在后续章节中详细探讨这种程序结构。

早期的Windows 1.0版本只能支持不到450个函数,而今天则支持数千个API函数。

我们把windows 1.0到3.1版本称为win16,win95及98之后的所有NT版本称为win32。从win16到win32转化过程中大部分函数保持不变,但也有一些需要扩展,比如图形坐标点数值从win16的16位扩展为32位。此外,win16中有些函数调用返回的二维坐标点被压缩到一个32位的整数里,这在win32中就行不通了。为解决这些问题,win32增加了一些新的函数。

所有32位版本的windows既支持win16 API以保证和原先的程序兼容,也支持win32 API以运行新的应用程序。有意思的是,windows NT与win95和win98的工作方式不同。在WINDOWS NT中,win16的函数调用通过一个翻译层先被转换成win32的函数调用,然后再由操作系统来处理。而在windows95和windows 98中正好相反,win32的函数调用通过一个翻译层先被转换成win16的函数调用,然后再由操作系统来处理。

       接下来,我们逐一介绍三个Windows应用程序必备的dll动态链接库。

1.2.1 kernel32.dll

       kernel32.dll是一个Windows操作系统核心动态链接库文件。库中包含了九百多个API函数,这些API函数主要负责内存管理、进程和线程管理、调试、错误处理和时间处理等功能。

内存管理:kernel32.dll包含了管理内存的API函数。例如:

●GlobalAlloc和LocalAlloc函数用于从堆中分配内存。

●GlobalFree和LocalFree函数用于释放之前分配的内存。

●VirtualAlloc和VirtualFree函数用于分配和释放大块的进程虚拟地址空间(4GB)中的内存。

●HeapAlloc和HeapFree函数用于管理堆中的内存。

●HeapCreate函数创建私有堆。

类似的虚拟空间和堆栈的操作函数还有很多,不再一一列举。

进程和线程管理:Windows操作系统作为多任务系统,需要创建、管理、维护和切换多个任务。Windows操作系统是进程强相关的操作系统,进程与进程之间可以进行读写操作。Windows操作系统中的进程可以包含一个或多个线程,进程是一些资源的集合,进程内的所有线程可以共享这些资源。在多任务系统中,任务切换其实就是线程切换。可以是同一进程中的线程切换,也可以是不同进程间的线程切换。kernel32.dll包含的常用的进程和线程函数有:

●CreateProcess函数创建进程。

●CreateThread函数创建线程。

●CloseHandle函数减少一个内核对象计数。

●WaitForSingleObject函数检测内核对象信号状态。

●CreateEvent函数创建事件内核对象。

●TerminateProcess函数结束进程。

●TerminateThread函数结束线程。

调试函数:kernel32.dll还包含了一些和调试相关的函数,包括进程间的远程读写。例如:

●DebugActiveProcess函数使调试程序能够附加到活动进程并对其进行调试。

●GetThreadContext函数可以检索指定线程的上下文。

●ReadProcessMemory函数从指定进程中的内存区域读取数据。

●WriteProcessMemory函数将数据写入到指定进程中的内存区域。

错误处理:在程序开发中,难免会出现一些错误和异常,检测和处理这些错误和异常需要使用kernel32.dll中的函数。例如:

●SetUnhandledExceptionFilter函数安装一个顶层的全局异常处理程序。

●GetExceptionCode函数用于获取异常的类型。

●GetExceptionInformation函数用于获取异常的信息。

●RaiseException函数在调用线程中引发异常。

●GetLastError函数检索最后错误代码。

●若要访问消息字符串,需要使用 FormatMessage 函数。

时间处理:Windows操作系统提供了各种各样的时间处理函数,这些函数无疑都是在动态链接库kernel32.dll中的。例如:

●系统时间函数GetSystemTime检索 UTC 格式的当前系统日期和时间。

●SetSystemTime函数设置当前系统时间和日期。

●本地时间函数GetLocalTime检索当前本地日期和时间。

●用于处理文件时间的函数GetFileTime检索指定文件或目录的创建、上次访问和上次修改的日期和时间。

●FileTimeToLocalFileTime函数将 UTC 文件时间转换为本地文件时间。●FileTimeToSystemTime函数将文件时间转换为系统时间格式。

1.2.2 user32.dll

user32.dll主要负责处理用户图形界面,是Windows用户界面相关应用程序接口。user32.dll中常用的API函数如下:

窗口操作

●CreateWindowEx函数用指定方式创建一个窗口。

●CreateMDIWindow函数创建一个多文档界面窗口。

●DestroyWindow函数销毁指定的窗口。

●FindWindow函数从类名或窗口名中返回一个相匹配的顶层窗口的句柄。

●GetWindow函数返回指定窗口的句柄。

●RegisterClass函数为以后调用CreatWindow函数注册一个窗口类。

菜单操作

●CreateMenu函数创建一个菜单,然后用AppendMenu函数填充菜单项。

●DestroyMenu 函数销毁指定的菜单。

●GetMenuItemInfo函数返回有关菜单项的信息。

●AppendMenu函数在给定菜单的尾不增加新项。

对话框操作

●CreateDialotParam函数从对话框模板资源中创建一个无模式对话框。

●DialogBoxParam 函数从对话框模板资源中创建一个模式对话框。

●MessageBox函数创建、显示并操作一个消息框。

GUI对象操作

●CreateCursor函数用指定大小、位模式、热点创建一个光标。

●CreateIcon 函数用指定大小、颜色和位模式创建一个图标。

●CopyRect函数拷贝一个矩形坐标。

●GetScrollInfo函数返回滚动条的参数,包括最小/最大滚动位置,页大小及拇指框的位置。

●LoadImage函数装入一个图标、光标或位图。

●SetScrollRange函数设置滚动条最大或最小位置值。

提示

【注】Windows对象可以分为GUI对象、GDI对象和内核对象三类。

GUI对象包括窗口、客户窗口、滚动条、菜单、标题栏等用户图形界面中的对象。

GDI对象包括画笔、画刷、字体、位图、路径、调色板等绘图工具。

内核对象包括进程、线程、事件、信号量、互斥量等内核中创建的对象。

消息操作

●GetMessage函数从指定线程的消息队列中检取一条消息。

●PeekMessage函数检查应用程序的消息队列。

●PostMessage函数在指定的窗口消息队列中放置一条消息。

●SendMessage函数把一消息发送给指定的多个窗口。

●TranslateMessage函数把虚键消息翻译为字符消息。

●DispatchMessage函数传送一个消息给指定的窗口过程。

1.2.3 gdi32.dll

gdi32.dll动态链接库用于图形设备接口(GDI)功能的实现。GDI是一个图形接口,负责处理Windows系统中的图形和字体操作,如绘制图形、显示文本、打印等操作。GDI函数有一个非常明显的特征是函数的第一个参数一定是设备环境上下文句柄(跟踪设备上下文地址的指针)。gdi32.dl中常用的API函数如下:

GDI对象操作

●CreateBitmap 函数创建具有指定宽度、高度和颜色格式的位图, (颜色平面和每像素位) 。

●CreateBrushIndirect 函数创建具有指定样式、颜色和图案的逻辑画笔。

●CreatePen 函数创建具有指定样式、宽度和颜色的逻辑笔。 笔随后可以选择到设备上下文中,并用于绘制线条和曲线。

●CreateSolidBrush 函数创建具有指定纯色的逻辑画笔。

●CreateCompatibleDC 函数创建与指定设备兼容的内存设备上下文 (DC) 。

●CreateDIBitmap 函数从 DIB 创建兼容位图 (DDB) ,并选择性地设置位图位。

●CreateFont 函数创建具有指定特征的逻辑字体。 随后可以选择逻辑字体作为任何设备的字体。

●CreatePalette 函数创建逻辑调色板。

●GetDC 函数检索设备上下文的句柄, (指定窗口的工作区或整个屏幕的 DC) 。

●getObject 函数 (wingdi.h) 检索指定图形对象的信息。

绘图函数

●LineTo 函数从当前位置绘制一条线,但不包括指定点。

●MoveToEx 函数将当前位置更新为指定点,并根据需要返回上一个位置。

●Rectangle 函数绘制矩形。 矩形使用当前笔轮廓,并使用当前画笔填充。

●RoundRect 函数绘制带圆角的矩形。 矩形使用当前笔轮廓,并使用当前画笔填充。

●Ellipse 函数绘制椭圆形。 椭圆的中心是指定边框的中心。 椭圆形使用当前笔轮廓,并使用当前画笔填充。

●CreateEllipticRgn 函数创建椭圆区域。

●CreatePolygonRgn 函数创建多边形区域。

●CreateRectRgn 函数创建矩形区域。

●DrawText 函数在指定矩形中绘制格式化文本。

●TextOut 函数使用当前所选字体、背景色和文本颜色在指定位置写入字符串。

●FillPath 函数关闭当前路径中所有打开的图形,并使用当前画笔和多边形填充模式填充路径的内部。

●FillRect 函数使用指定的画笔填充矩形。 此函数包括左边框和上边框,但不包括矩形的右边框和下边框。

●FrameRect 函数使用指定的画笔在指定矩形周围绘制边框。 边框的宽度和高度始终是一个逻辑单元。

●FrameRgn 函数使用指定的画笔在指定区域周围绘制边框。

●GetDIBits 函数检索指定兼容位图的位,并使用指定格式将其作为 DIB 复制到缓冲区中。

●PlayMetaFile 函数显示存储在指定设备上的给定 Windows 格式图元文件中的图片。PolyDraw 函数绘制一组线段和 B zier 曲线。

●PolyBezierTo 函数绘制一条或多条 B zier 曲线。

●PolylineTo 函数绘制一条或多条直线。

●SetMapMode 函数设置指定设备上下文的映射模式。 映射模式定义用于将页面空间单位转换为设备空间单位的度量单位,还定义设备的 x 和 y 轴的方向。

●BitBlt 函数将对应于像素矩形的颜色数据从指定的源设备上下文传输到目标设备上下文中。

●BeginPaint 函数准备用于绘制的指定窗口,并使用有关绘制的信息填充 PAINTSTRUCT 结构。

打印输出函数

●StartDoc 函数启动打印作业。

●EndDoc 函数结束打印作业。

●EndPage 函数通知设备应用程序已完成对页面的写入。 此函数通常用于指示设备驱动程序转到新页面。

●StartPage 函数准备打印机驱动程序以接受数据。

●GetPrinter 函数检索有关指定打印机的信息。

●EnumPrinters 函数枚举可用的打印机、打印服务器、域或打印提供程序。

本文摘自编程达人系列教材《Windows API每日一练》。

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

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

相关文章

Nginx服务的主配置文件及配置举例

Nginx服务的主配置文件 安装Nginx认识Nginx服务全局配置I/O 事件配置HTTP 配置日志格式设定 访问状态统计配置查看Nginx已安装模块修改 nginx.conf 配置文件重启服务,访问测试 基于授权的访问控制准备用户密码认证文件修改 nginx.conf 配置文件重启服务,…

java向上转型

介绍 代码 父类 package b;public class father_ {//father classString name"动物";int age10;public void sleep() {System.out.println("睡");}public void run() {System.out.println("跑");}public void eat() {System.out.println("…

ISCC2024之Misc方向WP

目录 FunZip Magic_Keyboard Number_is_the_key RSA_KU 成语学习 钢铁侠在解密 工业互联网模拟仿真数据分析 精装四合一 时间刺客 有人让我给你带个话 FunZip 题目给了一个txt,内容如下 一眼丁真,base隐写,使用工具即可得到flag Fl…

在Centos上为Tesla T4显卡安装NVIDIA驱动以及cuda和cudnn

前期准备: 升级gcc编译环境: 查看gcc版本: gcc -v (centos默认好像是4.8.5版本) 升级gcc: yum install centos-release-scl yum install devtoolset-9-gcc* 备份旧链接创建新链接:…

----JAVA 继承----

引言 再java中你能创造出很多的类,但如果这些类中的成员再另一个类中也要使用,那么就要用到继承来实现指定类中成员的使用了 那么也就可以写出这样的代码 再类Cat中使用了类Animal的成员,这里我们称Cat叫子类,Animal叫父类 概念…

【UE+GIS】UE5GIS CAD或shp构建3D地形

贴合地形的矢量图形实现方法 一、灰度图的制作和拉伸换算1、基于高程点集实现2、基于等高线实现3、拉伸计算 二、生成地形模型的实现方案1、3Dmax导入灰度图2、使用ArcMap/Arcpro/FME等GIS数据处理工具3、UE导入灰度图 三、地形上叠加地形渲染效果的实现方案1、贴花2、数据渲染…

Z字形变换 ---- 模拟

题目链接 题目: 分析: 题意如图所示:如果我们按照题意, 真的实现一个矩阵, 这样做的时间和空间复杂度很高, 所以我们可以试试看找规律, 优化一下我们观察他们的下标: 如果找到下标的规律, 那么我们就不用创建矩阵, 就能找到最终结果的下一个字符是什么特殊情况, 当numRows 1…

读AI未来进行式笔记01深度学习

1. AI 1.1. AI已经发展成一门涵盖许多子领域的重要学科 1.2. 机器学习是迄今为止AI应用最成功的子领域 1.2.1. 在这个领域中,最大的技术突破就是深度学习 1.3. “人工智能”“机器学习”和“深度学习”的时候&#xff…

Pointnet学习以及对代码的实现

由于点云不是常规数据格式,通常将此类数据转换为规则的 3D 体素网格或图像集合,然后再用神经网络进行处理。数据表示转换使生成的数据过于庞大。 PointNet是第一个直接处理原始点云的方法。只有全连接层和最大池化层,PointNet网络在推理速度…

代码随想录--哈希表--两数之和

题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 示例: 给定 nums [2, 7, 11, 15], t…

李廉洋:6.3黄金原油下周一开盘行情价格涨跌趋势分析及最新操作建议多空布局

黄金消息面分析:上周黄金市场的走势受到了PCE通胀数据和美联储政策预期的显着影响。尽管市场对黄金的长期看涨情绪依然存在,但短期内金价的波动性预计将持续。4月份的PCE通胀数据显示价格压力有所降温,这一结果与分析师预期一致,但…

2024年6月2日 (周日) 叶子游戏新闻

中医百科中药: 中医百科中药是一款非常强大的中药知识科普软件,该应用提供500多味中草药的文献资料,强大的搜索功能可根据功效、特点和关键词来快速查找中药,而且每味中药的图片、功效、主治、炮制方法等百科知识,可以很好的帮助你…

Pycharm SSH远程连接时出现报错,测试 SFTP 连接,连接到 ‘connect.westb.seetacloud.com‘ 失败

问题由来 很离谱!今天本来打算租借AutoDL的显卡完成一项深度学习的任务,很离谱的是同步文件夹的时候报了标题说的错。 就很莫名奇妙,一天都在网上找解决办法,结果都不对头。 其他报错 最后摸索着,在使用pycharm远程登…

SpringBoot 定时任务+Quartz

1、分部解释2、整体代码 前言: 1、定时任务技术: JDK 的 Timer, 定义多个定时任务,其中某个任务出现异常,当时整个定时任务终止。Spring Task , 不支持 持久化与分布式部署,所有任务是单线程执行…

Prism 入门01,基础

Prism 框架是支持多平台的一种MVVM框架(Model-View-ViewModel) 除了具备一些基础的属性通知绑定,命令操作,消息聚合器等功能外。还具备一些强大的功能:例如,区域,导航,会话服务,模块注入等特性。 一.如何在WPF 项目中使用Prism 框架 1.打开Visual Studio 2022,选择创…

【排序】选择排序(含优化版)

本章我们继续讲排序算法,这里我们将学习选择排序,也是一个很普遍很常见的排序算法,逻辑和代码都比较简单,比较容易掌握,我们直接走起 选择排序 基本思想:选择排序(SelectSort)&…

Layui2.5.6树形表格TreeTable使用

1、问题概述? Layui2.5.6的树形表格-TreeTable终于用明白了,步骤详细,提供源码下载。 如果你使用的是Layui2.8+版本,那么点个赞,赶紧去官网看吧,官网更行了。 更新地址:树表组件 treeTable - Layui 文档 最近在项目中需要使用到树形表格,用来显示菜单的层级关系,当…

辩证 逻辑学 | 洞察 事物矛盾及变化规律 在形式逻辑基础上 学会辩证思维(40节课)

课程下载:辩证逻辑学洞察事物矛盾及变化规律在形式逻辑基础上学会辩证思维(40节课)-课程网盘链接提取码下载.txt资源-CSDN文库 更多资源下载:关注我。 在形式逻辑的基础上,学会 辩证思维 敏锐 洞察事物发展变化的规…

Linux命令篇(一):文件管理部分

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 1、cat命令常用参…

童趣盎然,米香四溢 —— 蒙自源六一儿童节特别献礼

充满欢声笑语的六一儿童节马上就要来了,在这个充满童真和喜悦的时刻,蒙自源米线品牌以一颗童心,为所有大朋友和小朋友准备了一份特别的礼物。 从5月25日开始,蒙自源诚挚邀请您和孩子们一同前往蒙自源旗下各大门店,品尝…