WIN32核心编程 - 数据类型 错误处理 字符处理

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> 链接点击跳转博客主页

目录

数据类型

基本数据类型

Win32基本数据类型

错误处理

C语言中的错误处理

C++中的错误处理

Win32中的错误处理

字符处理

C/C++

WIN32

字符处理


数据类型

  • 基本数据类型

    • C/C++语言定义了一系列的基本数据类型,语言标准保证了它们的最小大小。

    • Win32 API定义了自己的一套数据类型,这些数据类型的大小在所有Windows平台上都是固定的,从而确保了应用程序的兼容性。

  • Win32基本数据类型

    • 确保平台兼容性:Windows操作系统在不同的平台(比如32位和64位)上有不同的实现细节。使用Win32 API定义的数据类型可以确保应用程序在这些平台上具有一致的行为。

    • 提高代码的可移植性:当你的代码需要在不同的Windows版本之间移植时,使用Win32 API的数据类型可以减少因为数据类型大小差异导致的问题。

    • 增强代码的阅读性和可维护性:通过使用明确定义的数据类型,代码的可读性会提高,同时也便于维护和更新。

    • 满足API调用要求:许多Win32 API函数要求使用特定的数据类型作为参数,或者返回这些类型的数据。使用正确的数据类型是调用这些函数的前提。

    • 大小明确:Win32 API中的数据类型如INT32, UINT32, INT64, UINT64等明确指定了数据类型的大小,而C/C++标准中的int, long等类型的大小则可能根据编译器和目标平台的不同而变化。

    • 类型命名:Win32 API倾向于使用全大写字母来命名数据类型(例如,DWORD, HANDLE),而C/C++的数据类型命名通常是小写的(如int, float)。

    • 布尔类型:C语言原生并不支持布尔类型(直到C99引入_Bool),而C++中有bool类型。Win32 API使用BOOL类型,通常是通过定义为int类型来实现的。

    • 特殊用途类型:Win32 API定义了一系列特殊用途的数据类型,如HANDLE, HWND, HINSTANCE等,这些是用于特定Windows资源管理的抽象类型,C/C++标准中没有对应的类型。

错误处理

  • C语言中的错误处理

    • C语言的错误处理较为基础,通常依赖于函数返回值和一些全局变量来传递错误信息。

    • 函数返回值

      • 返回负数,如-1,表示函数执行失败。

      • 返回NULL指针,表示无法执行操作(如内存分配失败)。

    • 全局变量 errno

      void OpenFileByC(const char* szFilePath)
      {
      FILE* pFile = NULL;
      fopen_s(&pFile, szFilePath, "r");
      if (pFile == NULL)
      {
          perror("fopen_s");
      }
      }
      
      • 当C标准库函数发生错误时,往往会设置一个全局变量errno,该变量在<errno.h>中定义。
      • perror():输出一条错误消息到标准错误,描述最后一次错误。

      • strerror():返回一个指向错误文本消息的指针,这个消息对应于errno的当前值。

  • C++中的错误处理

    • C++提供了比C更丰富的错误处理机制,包括返回值、异常(exception)处理等。

    • 函数返回值

      • C++同样可以使用返回值来表示错误,方法和C类似,但是这种方式在C++中通常不是首选。
    • 异常处理

      void OpenFileByCPP(const char* szFilePath)
      {
      std::ifstream inFileStream(szFilePath);
      if (!inFileStream)
      {
          throw std::runtime_error("OpenFileByCPP");
      }   
      }
      
      • C++引入了异常处理机制,允许在检测到错误时抛出一个异常,并在程序的其他部分捕获并处理该异常。

  • Win32中的错误处理

    • 函数返回值

      • Win32函数经常返回一个指示成功或失败的值,如BOOL类型的函数通常在成功时返回非零,在失败时返回零。

      • NULLFALSEINVALID_HANDLE_VALUE

    • 函数错误码

      • 当Win32 API函数失败时,可以调用GetLastError()来检索扩展的错误信息。

      • SetLastError()用于设置调用线程的最后错误代码。

    • 错误处理函数

      • FormatMessage():将GetLastError()返回的错误代码转换为可读的文本消息。

      • MessageBox():可以用来显示错误消息或其他信息。

      • #include <iostream>
        #include <Windows.h>
        
        VOID PrintfLastError()
        {
        	DWORD dwError = GetLastError();
        	LPVOID lpBuffer = NULL;
        	FormatMessageA(
        		FORMAT_MESSAGE_ALLOCATE_BUFFER |
        		FORMAT_MESSAGE_FROM_SYSTEM,
        		NULL,
        		dwError,
        		MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
        		(LPSTR)&lpBuffer,
        		0,
        		NULL);
        
        	std::cout << "ErrorCode -> " << dwError << std::endl;
        	std::cout << "ErrorMesg -> " << (LPSTR)lpBuffer << std::endl;
        
        	LocalFree(lpBuffer);
        }
        
        VOID TerminateProcessByPid(DWORD dwPid)
        {
        	//进程句柄
        	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
        	if (hProcess == NULL)
        	{
        		std::cerr << "OpenProcess Failed" << std::endl;
        		PrintfLastError();
        		return;
        	}
        
        	//结束进程
        	BOOL bIsTerminate = TerminateProcess(hProcess, 0);
        	if (bIsTerminate == NULL)
        	{
        		std::cerr << "TerminateProcess Failed" << std::endl;
        		PrintfLastError();
        		return;
        	}
        
        	//关闭句柄
        	CloseHandle(hProcess);
        }
        
        int main()
        {
        	DWORD dwProcessId = 0;
        	std::cout << "Please Input Process Id to Terminate: ";
        	std::cin >> dwProcessId;
        	TerminateProcessByPid(dwProcessId);
        
        	return 0;
        }

字符处理

  • C/C++

    • char:在ASCII编码中使用。用于表示单个字节。

      • strlen, strcpy, strcat, strcmp等:这些函数用于处理以null结尾的char字符串。
    • wchar_t:用于Unicode字符串。用于表示两个字节。

      • wcslen, wcscpy, wcscat, wcscmp等:这些宽字符版本的函数用于处理wchar_t类型的字符串。

  • WIN32

    • Win32 API支持两种字符集:ANSI和Unicode。根据定义UNICODE宏和编译选项,相同的函数名可以处理char类型或wchar_t类型的字符串。

      • CHAR:一个字节的ANSI字符。

      • lstrlen, lstrcpy, lstrcat, lstrcmp等:用于处理CHAR类型的字符串。

      • WCHAR:二个字节的Unicode字符。

      • lstrlenW, lstrcpyW, lstrcatW, lstrcmpW等:这些是处理WCHAR类型的字符串的宽字符版本函数。

    • 为了编写在ANSI和Unicode之间可以灵活切换的代码,Win32提供了一个名为tchar.h的头文件,它定义了通用的宏和类型映射。

      • TCHAR:映射到CHARWCHAR,取决于是否定义了UNICODE

      • _tcslen, _tcscpy, _tcscat, _tcscmp等:这些宏根据编译选项映射到对应的ANSI或Unicode函数。

      • TEXT(STR);

    • 注意事项

      • 编写Win32程序时,推荐默认使用Unicode(即定义UNICODE宏)。这能更好地支持多语言,并且是现代Windows应用的最佳实践。

      • 和C/C++标准库一样,Win32 API中的一些字符串处理函数也存在安全风险。应优先使用它们的安全版本(例如,使用StringCchCopy而不是lstrcpy)。

  • 字符处理

    • 字符串复制和连接

      • ANSI: lstrcpy, lstrcat

      • Unicode: lstrcpyW, lstrcatW

    • 字符串长度

      • ANSI: lstrlen

      • Unicode: lstrlenW

    • 字符串比较

      • ANSI: lstrcmp, lstrcmpi (不区分大小写)

      • Unicode: lstrcmpW, lstrcmpiW

    • 字符转换

      • MultiByteToWideChar

      • 用于将ANSI字符串转换为Unicode字符串。

      • WideCharToMultiByte

      • 用于将Unicode字符串转换为ANSI字符串。

      • #include <windows.h>
        #include <stdio.h>
        
        int main() {
            // ANSI到Unicode的转换
            char* ansiStr = "Hello, World!";
            wchar_t unicodeStr[50];
            MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, unicodeStr, 50);
            wprintf(L"ANSI to Unicode: %ls\n", unicodeStr);
        
            // Unicode到ANSI的转换
            char convertedAnsiStr[50];
            WideCharToMultiByte(CP_ACP, 0, unicodeStr, -1, convertedAnsiStr, 50, NULL, NULL);
            printf("Unicode to ANSI: %s\n", convertedAnsiStr);
        
            return 0;
        }
        

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

umi项目中的一些趣事

前言 出于某些安全问题&#xff0c;需要把HTML中框架注入的umi版本信息去掉&#xff0c;那要怎么搞呢~ 方案 查找官方文档&#xff0c;没发现可以去掉注入信息的方法&#xff0c;但在一番折腾后&#x1f609;终究还是解决了~ 发现 版本信息是从这里注入的~ Object.define…

uboo对内存操作读写命令的基本使用

内存操作命令 直接对DRAM进行读写的操作,uboot常用的内存操作命令有md,nm,mm,mw,cp和cmp. md命令: 显示内存值 # md md - memory display Usage: md [.b, .w, .l, .q] address [# of objects] b:1个字节 byte w:2个字节 world l:4个字节 long of objects 以word 为单位的1…

人工智能--图像语义分割

个人主页&#xff1a;欢迎来到 Papicatch的博客 课设专栏 &#xff1a;学生成绩管理系统 专业知识专栏&#xff1a;专业知识 ​ 文章目录 &#x1f349;引言 &#x1f349;介绍 &#x1f348;工作原理 &#x1f34d;数据准备 &#x1f34d;特征提取 &#x1f34d;像素分…

实习总结 --- 其他业务

一. 回归测试&#xff1a;回归测试与测新是对应的&#xff0c;当需求准入交付测试的时候首先要进行的就是测新&#xff0c;也就是对新功能对测试&#xff0c;一般是在sim环境下测试的&#xff1b;当测新通过后才会进行回归测试&#xff0c;回归测试的目的是为了保证老功能的正确…

人工智能 (AI) 基本概念 入门篇【C#】版

1. 什么是人工智能&#xff1f; 人工智能&#xff08;Artificial Intelligence, AI&#xff09;是指计算机系统能够执行通常需要人类智能的任务&#xff0c;如视觉识别、语音识别、决策和语言翻译等。AI的核心是通过算法和数据进行学习和推理&#xff0c;以实现智能行为。 2.…

2.3.2 主程序和外部IO交互 (文件映射方式)----IO Client实现

2.3.2 主程序和外部IO交互 &#xff08;文件映射方式&#xff09;----IO Client C实现 和IOServer主要差别&#xff1a; 1 使用Open_Client 连接 2 一定要先打开IOServer&#xff0c;再打开IO_Client 效果显示 1 C 代码实现 1.1 shareddataClient.h 头文件中引用 和sharedd…

PTA-线性表实验(JAVA)

题目1&#xff1a;Josephus环的问题及算法 【实验内容】 编程实现如下功能&#xff1a; 题意说明&#xff1a;古代某法官要判决n个犯人的死刑&#xff0c;他有一条荒唐的法律&#xff0c;将犯人站成一个圆圈&#xff0c;从第start个犯人开始数起&#xff0c;每数到第distance的…

Redis基础教程(一):redis配置

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

信息安全体系架构设计

对信息系统的安全需求是任何单一安全技术都无法解决的&#xff0c;要设计一个信息安全体系架构&#xff0c;应当选择合适的安全体系结构模型。信息系统安全设计重点考虑两个方面&#xff1b;其一是系统安全保障体系&#xff1b;其二是信息安全体系架构。 1.系统安全保障体系 安…

Go语言特点、编译及命令

本文主要分为三部分内容分别为&#xff1a;Go语言的特点介绍&#xff1b;编译windows、linux环境文件及Go命令。 目录 Go语言特点 编译文件 编译window文件 编译linux文件 Go命令&#xff08;build/run/install/env&#xff09; 编译文件 直接运行程序 安装程序 配置G…

【分布式数据仓库Hive】常见问题及解决办法

目录 一、启动hive时发现log4j版本和hadoop的版本有冲突 解决办法&#xff1a;删除hive下高版本的slf4j 二、启动hive报错 Exception in thread "main" java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkArgument(ZLjava/lang/Object;)V …

个人博客|PHP源码|支持多国语言切换

一. 前言 今天小编给大家带来了一款可学习&#xff0c;可商用的&#xff0c;支持多国语言的个人博客网站源码&#xff0c;支持二开&#xff0c;无加密。此博客相当简洁&#xff0c;也适合海外。详细界面和功能见下面视频演示。 如果您正好有此需求源码&#xff0c;请联系小编…

Zabbix 配置钉钉告警

Zabbix 配置钉钉告警 随着企业IT运维需求的不断增加&#xff0c;及时、准确地获取系统告警信息显得尤为重要。在众多告警工具中&#xff0c;Zabbix 因其强大的监控功能和灵活的告警机制&#xff0c;成为了很多企业的首选。同时&#xff0c;随着企业内部沟通工具的多样化&#…

苹果AI的国产大模型之争,没有悬念

文 | 智能相对论 作者 | 陈泊丞 苹果终于公布了最新的AI进程。 一个月前&#xff0c;正如此前预期的那样&#xff0c;人工智能是今年 WWDC 发布会的焦点。全程105分钟的主题演讲&#xff0c;就有40多分钟用于介绍苹果的AI成果。 苹果似乎还有意玩了一把“谐音梗”&#xff…

海外虚拟卡开卡平台有哪些?无限开卡,无其他限制

随着时代的发展很多小伙伴都需要海外虚拟卡&#xff0c;海外虚拟卡开卡平台我这里用的是Fomepay的&#xff0c;他们比较人性化&#xff0c;有客服&#xff0c;随时可咨询 对于消费者而言&#xff0c;虚拟卡号提供了隐私&#xff0c;因此广告商更难以跟踪和定位购买行为&#x…

深入浅出:进程管理的艺术

目录 进程的定义 进程的特征 进程的状态 进程与程序的区别 进程的控制和管理 进程的特点 1. 虚拟内存空间的分配 2. 时间片轮转调度 图解&#xff1a; 进程段 数据段&#xff08;Data Segment&#xff09; 正文段&#xff08;Text Segment&#xff09; 堆栈段&…

Redis持久化详解

【关闭文件、AOF 刷盘、释放内存这三个任务都有各自的任务队列】所以不是单线程 Redis有两种持久化方案&#xff1a; RDB持久化 AOF持久化 基于Redis集群解决单机Redis存在的问题 【Redis是单进程的】 【也有人做分布式section】 【主从集群中多个从就是做负载均衡的】 …

一维信号全变分(TV)降噪方法(MATLAB)

信号降噪一直是领域研究的热点&#xff0c;这是一项十分有意义并且极具挑战性的工作&#xff0c;经过几十年来相关科研人员的共同努力&#xff0c;降噪技术得到了极大的发展&#xff0c;并在现实生活中也得到了广泛的应用。其中&#xff0c;许多常用的方法有&#xff1a;小波变…

vector模拟实现【C++】

文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间和类类的成员变量 迭代器迭代器获取函数 构造函数默认构造使用n个值构造迭代器区间构造解决迭代器区间构造和用n个值构造的冲突拷贝构造 析构函数swap【交换函数】赋值运算符重载emptysize和capacityopera…

上位机网络通讯

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using System; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 上位机网络通讯 {public partial class Form1 : Form{public Form1(){Initializ…