API学习笔记:2.3-2.4 API核心DLL与Unicode和多字节

2023-11-16


前面几章基本都是总体的叙述与了解过程,所以挑重点记录以下笔记

2.3 Windows核心DLL

动态链接库文件DLL:
包括了Windows API 函数可执行程序。
DLL时将各函数“导出” API 函数主要存在于几个核心的动态连接库文件中.
Kenid32.dll 是最重要的 DLL,Windows 系统最主要的系统服务 API 函数都存在于 Kernel32.dll 中。
User32.dll 主要包括图形用户界面中所使用到的一些函数接口。
GDI32.dll中,主要包括 Windows 图形引擎中的接口函数。

在应用程序调用一个 API 前, 操作系统会通过程序文件(exe) 中的导入表结构找到需要调用的API函数位于哪个DLL并确定函数在内存中的地址, 应用程序才可以成功调用 API 函数。

2.3.1 核心DLL简介

DLL 简介
Kernel32.dll Kernel32.dll 包括了系统基本服务中最基本的 API 函数,如文件系统、进程与线程、内存管理等。
User32.dll Uscr32.dll是Windows 图形用户界面的主要支持。 一些重要的图形用户界面函数由 User32.dll函数导出。
Gdi32.dll Gdi32.dll 是 Windows GDI 应用程序设计接口,Gdi32.dll 导出了与此相关的若干函数, 如GetTextColor、 LineTO、 TextOut等。
标准 C 函数及 CrtdIl_dll 任何支持 C 语言应用程序开发的操作系统都应该提供 C 语言库函数的调用。正是由于各个主流操作系统都提供了一套标准 C 库所定义的函数接口, 标准 C 函数库才会有如此广泛的跨越操作系统平台,Windows 系统的 C 标准库函数接口主要由 CrtdIl_dll 导出。
其他 Dll Windows 系统中的 DLL 文件远远不止这几个, Windows 系统提供了非常丰富而且功能强大的 API, 上文介绍了 Windows API 所主要依赖的几个 DLL。

2.4 Unicode和多字节

Windows 既可以使用 Unicode 字符集又可以使用传统的字符集( 如多字节编码) 来实现对多种语言的支持, 以适应国际市场的要求。
Unicode 是世界通用的字符编码标准, 使用 16 位数据表示一个字符, 一共可以表示 65535 种字符, 可以包括现代计算机中所使用的所有字符, 包括各种字母、 文字、 在出版业中使用的特殊符号等。
传统的字符集, 如 Windows ASNI 字符集, 使用 8 位数据或将相邻的两个 8 位的数据组合在一起表示特殊的语言字符。 Windows 系统采用了 ASNI 字符的扩展方式, 如果一个字节是负数, 则将其后续的一个字节组合在一起表示一个字符。 这种编码方式的字符集也称作“ 多宇节” 字符集。

书上的代码实例,不同宽度字符串的初始化,并将字符串的输出进行比较,这里提以下,用.c文件源代码不会出现错误和警告。代码如下:

#include<Windows.h>

int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR iCmdLine, _In_ int nCmdShow)
{
	//定义LPWSTR类型的字符串
	LPWSTR szUnicode = L"This is aUnicode String";
	//定义LPSTR类型的窄字符串
	LPSTR szMutliByte = "This is not a Unicode String";
	//定义LPTSTR类型的自适用字符串
	LPTSTR szString = TEXT("This string is Unicode or not depends on the option.");

	//使用W版本的API函数,以宽字符串为参数
	MessageBoxW(NULL, szUnicode, L"字符编码1", MB_OK);

	//使用 A 版本的 API 函数, 以窄字符串为参数
	MessageBoxA(NULL, szMutliByte, "字符编码2", MB_OK);

	//根据编译条件自动选择 A 版本或 W 版本的 API 函数, 采用相适应的字符串类型为参数
	MessageBox(NULL, szString, TEXT("字符编码3"), MB_OK);

	return 0;
}

三种字符串变量的初始化方式:

类型:变量类型 初始化方式
Unicode:LPWSTR L"string"
多字节:LPSTR “string”
根据开发环境的设置自动适应:LPTSTR TEXT(“string”)

书本中为我们以二进制的方式进行了对比这里我自己理解了下,如果有错,请指出:
在这里插入图片描述
这里内存是以ASNI的方式显示,所以Unicode是乱码
很明显可以看出Unicode的宽字符是以2个字节显示,ASNI是以1个字节显示,
这里如果把内存显示改为Unicode,如下:在这里插入图片描述
与上图内存中对比,可以看出MessageBox的标题也以中文的方式显示出来了,回到书中:
在工程配置中设置编码的方式:
“配置属性” —>“常规”—>“字符集” 选项中进选择。

2.4.1 W版本和A版本的API

先看图:
在这里插入图片描述
Windows 系统 API 凡是以字符串作为参数的很多具有 W 和 A 两个版本以实现两种不同编码的字符处理。
在 User32.dll 中导出的函数实际上没有 MessageBox, 只有 MessageBoxA 和 MessageBoxW, 这两者是同一个 API, 实现了同样的功能。 不同的是, MessageBoxA 以多字节字符串作为参数输入,MessateBoxW 以 Unicode 字符串作为参数输入。
在程序进行编译和连接时, 如果程序在 UNICODE 环境下, 会使用 MessageBoxW,否则使用 MessageBoxA。

2.4.2 Unicode与ASCII的转换

Windows 专门提供了若干个 API 来实现对字符编码的转换工作, WideCbarToMuItiByte,MultiByteToWideChar,UnicodeToBytes 函数可以完成这些工作。
WideCharToMuJtiByte 函数将 Unicode 字符串转换为多字节字符串, 以适应 A 版本的 API,MultiByteToWideChar 函数将多字节字符串转换为了 Unicode 字符串, 以适应 W 版本的 API 的参数形式耍求。

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

API学习笔记:2.3-2.4 API核心DLL与Unicode和多字节 的相关文章

随机推荐

  • Windows 10版本business_editions和consumer_editions的区别?

    Windows 10版本business editions和consumer editions的区别 答1 二者都内置专业版 不同之处在于 consumer editions 版本包含 Home 家庭版 Education 教育版 Prof
  • websocket封装

    封装 class SocketPlugin constructor param this websocket null this isConnect false this timeoutNum null this isActivelyClo
  • 动态多光源 Light-Pre-Pass Lighting 实现

    辛苦数天 终于有所突破 在rendermonkey里用glsl实现的代码请去这里下载 关于渲染器结构设计可参见 http www cnblogs com cloudffx archive 2011 08 31 2160208 html 关于
  • java三种实现文件上传方法

    文章转载自点击看原文 前言 因自己负责的项目 jetty内嵌启动的SpringMvc 中需要实现文件上传 而自己对java文件上传这一块未接触过 且对 Http 协议较模糊 故这次采用渐进的方式来学习文件上传的原理与实践 该博客重在实践 一
  • 房屋租赁

    作者主页 编程指南针 作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智
  • Android静态注册内部类广播BroadcastReceiver

    用静态注册内部类广播出现异常 09 14 11 31 25 576 E AndroidRuntime 3391 FATAL EXCEPTION main 09 14 11 31 25 576 E AndroidRuntime 3391 ja
  • Kettle下载Redisinput插件查询Redis数据

    Kettle下载Redisinput插件查询Redis数据 安装插件 1 下载Redisinput插件 https download csdn net download ispringmw 12909650 2 将完整插件包复制到Kettl
  • CGI之C语言篇

    为什么要进行CGI编程 在HTML中 当客户填写了表单 并按下了发送 submit 按钮后 表单的内容被发送到了服务器端 一般的 这时就需要有一个服务器端脚本来对表单的内容进行一些处理 或者是把它们保存起来 或者是按内容进行一些查询 或者是
  • Kubernetes笔记 (1) - 系统概述

    Kubernetes概述 Kubernetes由google开源 它的开发和设计都深受Google内部久负盛名的系统Borg的影响 而且 它的许多顶级贡献者之前也是Borg系统的开发者 Borg是Google内部使用的大规模集群管理系统 K
  • 分布式-zookeeper

    Zookeeper的Leader选举
  • 解决The number of method references in a .dex file cannot exceed 64K的问题

    需要分包build只需要 在build gradle defaultConfig中加入 multiDexEnabled true defaultConfig multiDexEnabled true
  • POI-Excel导出:发现xxx.xlsx中的部分内容有问题

    问题场景 新项目上需要用到页面上Excel导出下载 于是把老项目中用了很久的一个Excel工具类拿了过来 因为老项目导出的是 xls文件 新项目需要导出 xlsx 就对着改了下 改完之后导出文件 发现会弹出提示 点击是之后 文件能正常查看
  • 陀螺研究院:“模式币”项目生命周期比较研究报告(附完整PDF下载)

    文 陀螺研究院 飞鱼 秀秀 最近 PGC 和 趣步 项目跑路 很多维权帖子发布在网上 引发大家的热议 如果说2019年是 平台币之年 按照这样的发展趋势 把2019年称为 模式币之年 也不为过 模式币 疯狂拉盘造成的财富效应会吸引许多人入场
  • 创建一个popwindow 并动态设置pop的高度 限定pop高度

    创建一个popwindow 并动态设置pop的高度 限定pop高度 这里举个例子 pop里面放的是一个listview 直接上代码 SelectMedicalCasePopwindow java public class SelectMed
  • 力扣每日一题——三角形的最大周长

    题目链接 class Solution public int largestPerimeter vector
  • react仿钉钉流程图-审批工作流

    前言 此前做项目遇到一个流程图的业务场景 查找了一些资料和插件都没有找到理想的 最后找到了一款比较美观 仿钉钉流程图的 但是找来找去都找不到react版本的 只找到vue版本的 没办法 只能自己写一个 仿钉钉流程图 Api包括 一维数组传参
  • vue 自适应屏幕分辨率,在不同分辨率,以及缩放都按照设计稿展示

    项目中 会遇到这样的问题 一个网页在1920 1080的分辨率下 一屏正好展示完当前页面 但是在1366 768 或者在2k高分辨率下 页面会有滚动条 或者下方会出现空白 还有一种是14寸 或者13寸笔记本在出厂时会设置缩放125 或者15
  • C# NPOI写excel文件,设置某个单元格为自动筛选

    如标题所示 附上几行代码 HSSFWorkbook workbook new HSSFWorkbook 创建工作表 var sheet workbook CreateSheet 信息表 设置excel的自动筛选 CellRangeAddre
  • 函数局部有界性定理_高等数学入门——函数极限的基本性质

    系列简介 这个系列文章讲解高等数学的基础内容 注重学习方法的培养 对初学者不易理解的问题往往会不惜笔墨加以解释 在内容上 以国内的经典教材 同济版高等数学 为蓝本 并对具体内容作了适当取舍与拓展 例如用 语言证明函数极限这类高等数学课程不要
  • API学习笔记:2.3-2.4 API核心DLL与Unicode和多字节

    API核心DLL与Unicode和多字节 2 3 Windows核心DLL 2 3 1 核心DLL简介 2 4 Unicode和多字节 2 4 1 W版本和A版本的API 2 4 2 Unicode与ASCII的转换 前面几章基本都是总体的