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

news2024/12/28 20:11:23
  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> 链接点击跳转博客主页

目录

数据类型

基本数据类型

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;
        }
        

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

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

相关文章

Linux的Socket开发概述

套接字&#xff08;socket&#xff09;是 Linux 下的一种进程间通信机制&#xff08;socket IPC&#xff09;&#xff0c;在前面的内容中已经给大家提到过&#xff0c;使用 socket IPC 可以使得在不同主机上的应用程序之间进行通信&#xff08;网络通信&#xff09;&#xff0c…

cv2.cvtColor的示例用法

-------------OpenCV教程集合------------- Python教程99&#xff1a;一起来初识OpenCV&#xff08;一个跨平台的计算机视觉库&#xff09; OpenCV教程01&#xff1a;图像的操作&#xff08;读取显示保存属性获取和修改像素值&#xff09; OpenCV教程02&#xff1a;图像处理…

德国威步的技术演进之路(下):从云端许可管理到硬件加密狗的创新

从单机用户许可证到WkNET网络浮点授权的推出&#xff0c;再到引入使用次数和丰富的时间许可证管理&#xff0c;德国威步产品不断满足市场对灵活性和可扩展性的需求。TCP/IP浮动网络许可证进一步展示了威步技术在网络时代的创新应用。借助于2009年推出的借用许可证以及2015年推出…

CV- 人工智能-深度学习基础知识

一, 深度学习基础知识 1,什么是深度学习?机器学习是实现人工智能的一种途径,深度学习是机器学习的一个子集,也就是说深度学习是实现机器学习的一种方法。2, 传统机器学习算术依赖人工设计特征,并进行特征提取,而深度学习方法不需要人工,而是依赖算法自动提取特征。深度…

llm学习-4(llm和langchain)

langchain说明文档&#xff1a;langchain 0.2.6 — &#x1f99c;&#x1f517; langChain 0.2.6https://api.python.langchain.com/en/latest/langchain_api_reference.html#module-langchain.chat_models 1&#xff1a;模型 &#xff08;1&#xff09;自定义模型导入&#x…

代码随想录-Day46

121. 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从…

pmp顺利通关总结

目录 一、背景二、总结三、过程 一、背景 人活着总是想去做一些事情&#xff0c;通过这些事情来证明自己还活着。 而我证明自己还会活着并且活得很好的方式和途径&#xff0c;是通过这些东西去让自己有一个明确的边界节点&#xff1b;借此知识来验证自己的学习能力。 我坚定认…

掌握Go语言邮件发送:net/smtp实用教程与最佳实践

掌握Go语言邮件发送&#xff1a;net/smtp实用教程与最佳实践 概述基本配置与初始化导入net/smtp包设置SMTP服务器基本信息创建SMTP客户端实例身份验证 发送简单文本邮件配置发件人信息构建邮件头部信息编写邮件正文使用SendMail方法发送邮件示例代码 发送带附件的邮件邮件多部分…

硅纪元视角 | 1 分钟搞定 3D 创作,Meta 推出革命性 3D Gen AI 模型

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

服务器之BIOS基础知识总结

1.BIOS是什么&#xff1f; BIOS全称Basic Input Output System&#xff0c;即基本输入输出系统&#xff0c;是固化在服务器主板的专用ROM上&#xff0c;加载在服务器硬件系统上最基本的运行程序&#xff0c;它位于服务器硬件和OS之间&#xff0c;在服务器启动过程中首先运行&am…

《亚马逊搬运亚马逊产品》配合跟卖采集爬取跟卖店铺高质量

亚马逊高质量产品如何搬运&#xff1f;亚马逊采集亚马逊。 哈喽大家好&#xff0c;大家讲一下做亚马逊是发货、铺货这块的功能。目前这款软件做跟卖大家都知道&#xff0c;同时也支持做铺货。铺货可以采集国内的1688、淘宝、京东都可以采&#xff0c;采完之后也可以采速卖通&a…

flutter开发实战-Webview及dispose关闭背景音

flutter开发实战-Webview及dispose关闭背景音 当在使用webview的时候&#xff0c;dispose需要关闭网页的背景音或者音效。 一、webview的使用 在工程的pubspec.yaml中引入插件 webview_flutter: ^4.4.2webview_cookie_manager: ^2.0.6Webview的使用代码如下 初始化WebView…

UiPath+Appium实现app自动化测试

一、环境准备工作 1.1 完成appium环境的搭建 参考&#xff1a;pythonappiumpytestallure模拟器(MuMu)自动化测试环境搭建_appium mumu模拟器-CSDN博客 1.2 完成uipath的安装 登录官网&#xff0c;完成注册与软件下载安装。 UiPath业务自动化平台&#xff1a;先进的RPA及自动…

Linux操作系统学习:day08

内容来自&#xff1a;Linux介绍 视频推荐&#xff1a;Linux基础入门教程-linux命令-vim-gcc/g -动态库/静态库 -makefile-gdb调试 目录 day0853、命令和编辑模式之间的切换54、命令模式到末行模式的切换与末行模式下的保存退出命令模式到末行模式的切换保存退出 55、末行模式…

大模型训练优化方法

写在前面 在训练模型尤其是大模型的时候&#xff0c;如何加快训练速度以及优化显存利用率是一个很关键的问题。本文主要参考HF上的一篇文章&#xff1a;https://huggingface.co/docs/transformers/perf_train_gpu_one&#xff0c;以及笔者在实际训练中的一些经验&#xff0c;给…

SpringBoot 整合 Minio 实现文件切片极速上传技术

Centos7安装Minio 创建目标文件夹 mkdir minio使用docker查看目标镜像状况 大家需要注意&#xff0c;此处我们首先需要安装docker&#xff0c;对于相关安装教程&#xff0c;大家可以查看我之前的文章&#xff0c;按部就班就可以&#xff0c;此处不再赘述&#xff01;&#x…

【电商指标详解】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;本篇文章主要和大家分享一下电商行业中常见指标的详解&#xff01;存在的原因和作用&#xff01;&#xff01;&#xff01;希望对大家有所帮助。 &#x1f49e;&#x1f49e;代码是你的画…

论文学习笔记1:Federated Graph Neural Networks: Overview, Techniques, and Challenges

文章目录 一、introduction二、FedGNN术语与分类2.1主要分类法2.2辅助分类法 三、GNN-ASSISTED FL3.1Centralized FedGNNs3.2Decentralized FedGNNs 四、FL-ASSISTED GNNS4.1horizontal FedGNNs4.1.1Clients Without Missing Edges4.1.1.1Non-i.i.d. problem4.1.1.2Graph embed…

Navicat和MySQL的安装

1、下载 Navicat Navicat 官网&#xff1a;www.navicat.com.cn/ 在产品中可以看到很多的产品&#xff0c;点击免费试用 Navicat Premium 即可&#xff0c;是一套多连数据库开发工具&#xff0c;其他的只能连接单一类型数据库 点击试用 选择系统直接下载 二、安装 Navicat 安…

天诚长租公寓智能门锁管理解决方案

人才是区域创新发展的第一资源&#xff0c;如何解决人才的住房问题&#xff0c;让人才“流进来”、“留下来”、“融进来”&#xff0c;就需要优先安排优质人才公寓、人才优租房和公共租赁住房房源&#xff0c;并为青年人才群体提供智能化、信息化的租住体验及通行服务。 一、…