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

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

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

相关文章

双指针系列第 8 篇:盛水最多的容器。几句话讲明白!

Leetcode 题目链接 思路 取首尾双指针和水量如下所示&#xff0c;设高度函数为 h ( i ) h(i) h(i)&#xff0c;在下图中 h ( l ) < h ( r ) h(l) < h(r) h(l)<h(r)。 观察以 l l l 为左边界所能构成的其他水量&#xff0c;与矮的右边界搭配结果如下。 与高的…

Vue移动端地图App:van-uploader导致的卡顿问题

问题描述 基于Vue3+Vant IU 4开发的移动端地图App,在进行地图点位上报、上报记录查看过程中,出现App卡顿、甚至闪退的问题,进行问题定位之后,发现是van-uploader组件导致的问题。 van-uploader文件上传组件 van-uploader组件用于将本地的图片或文件上传至服务器,并在上传…

GOROOT GOPATH GOPROXY GO111MODULE

GOROOT GOROOT代表Go的安装目录。可执行程序go(或go.exe)和gofmt(或gofmt.exe)位于 GOROOT/bin目录中。 配置GOROOT环境变量&#xff0c;其值为Go的安装目录&#xff1b;然后在环境变量PATH中添加GOROOT/bin路径。 注意&#xff1a;GOROOT变量只是代表了安装目录&#xff0c;不…

Python基础小知识问答系列-可迭代型变量赋值

1. 问题&#xff1a; 怎样简洁的把列表中的元素赋值给单个变量&#xff1f; 当需要列表中指定几个值时&#xff0c;剩余的变量都收集在一起&#xff0c;该怎么进行变量赋值&#xff1f; 当只需要列表中指定某几个值&#xff0c;其他值都忽略时&#xff0c;该怎么…

红酒与建筑:品味历史与艺术的交汇

在时间的长河中&#xff0c;红酒与建筑都是人类智慧的结晶&#xff0c;它们各自承载着历史的厚重与艺术的韵味。当这两者交汇时&#xff0c;仿佛是一场穿越时空的对话&#xff0c;将我们带入一个既古老又现代、既深沉又温柔的世界。今天&#xff0c;就让我们一起走进这个奇妙的…

【前端VUE】VUE3第一节—vite创建vue3工程

什么是VUE Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0…

网页计算器的实现

简介 该项目实现了一个功能完备、交互友好的网页计算器应用。只使用了 HTML、CSS 和 JavaScript &#xff0c;用于检验web前端基础水平。 开发环境&#xff1a;Visual Studio Code开发工具&#xff1a;HTML5、CSS3、JavaScript实现效果 功能设计和模块划分 显示模块&#…

[数据集][目标检测]围栏破损检测数据集VOC+YOLO格式1196张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1196 标注数量(xml文件个数)&#xff1a;1196 标注数量(txt文件个数)&#xff1a;1196 标注…

1、音视频解封装流程---解复用

对于一个视频文件(mp4格式/flv格式)&#xff0c;audio_pkt或者video_pkt是其最基本的数据单元&#xff0c;即视频文件是由独立的视频编码包或者音频编码包组成的。 解复用就是从视频文件中把视频包/音频包单独读取出来保存成独立文件&#xff0c;那么如何得知packet是视频包还是…

MySQL高级-SQL优化- count 优化 - 尽量使用count(*)

文章目录 1、count 优化2、count的几种用法3、count(*)4、count(id)5、count(profession)6、count(null)7、 count(1) 1、count 优化 MyISAM引擎把一个表的总行数存在了磁盘上&#xff0c;因此执行count&#xff08;*&#xff09;的时候会直接返回这个数&#xff0c;效率很高&a…

esp12实现的网络时钟校准

网络时间的获取是通过向第三方服务器发送GET请求获取并解析出来的。 在本篇博客中&#xff0c;网络时间的获取是一种自动的行为&#xff0c;当系统成功连接WiFi获取到网络天气后&#xff0c;系统将自动获取并解析得到时间和日期&#xff0c;为了减少误差每两分钟左右进行一次校…

代码随想录-Day46

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

『MySQL 实战 45 讲』22 - MySQL 有哪些“饮鸩止渴”提高性能的方法?

MySQL 有哪些“饮鸩止渴”提高性能的方法&#xff1f; 需求&#xff1a;业务高峰期&#xff0c;生产环境的 MySQL 压力太大&#xff0c;没法正常响应&#xff0c;需要短期内、临时性地提升一些性能 短连接风暴 短连接模式&#xff1a;执行很少的 SQL 语句就断开&#xff0c;…

使用NFS网关功能将HDFS挂载到本地系统

HDFS安装教程 HDFS安装教程http://t.csdnimg.cn/2ziFd 使用NFS网关功能将HDFS挂载到本地系统 简介 HDFS提供了基于NFS&#xff08;Network File System&#xff09;的插件&#xff0c;可以对外提供NFS网关&#xff0c;供其它系统挂载使用。 NFS 网关支持 NFSv3&#xff0c;并…

接口测试流程及测试点!

一、什么时候开展接口测试 1.项目处于开发阶段&#xff0c;前后端联调接口是否请求的通&#xff1f;&#xff08;对应数据库增删改查&#xff09;--开发自测 2.有接口需求文档&#xff0c;开发已完成联调&#xff08;可以转测&#xff09;&#xff0c;功能测试展开之前 3.专…

使用 Ollama 时遇到的问题

题意&#xff1a; ImportError: cannot import name Ollama from llama_index.llms (unknown location) - installing dependencies does not solve the problem Python 无法从 llama_index.llms 模块中导入名为 Ollama 的类或函数 问题背景&#xff1a; I want to learn LL…

vscode中的字符缩进问题

问题描述&#xff1a; 如图当一行代码中出现不同类型的字符时&#xff0c;使用tab缩只是插入了固定数量&#xff08;默认4&#xff09;的空格或制表符&#xff0c;仍然无法对齐。 解决方法&#xff1a; vscode找到设置&#xff0c;搜索fontFamily&#xff0c;对应输入框写入mon…

Git 基础-创建版本库 git init、添加到暂存区git add、查看状态git status、查看改动git diff

目录 1.创建版本库 git init 1.创建版本库 git init 在目录中创建新的 Git 仓库。 你可以在任何时候、任何目录中这么做&#xff0c;完全是本地化的。 在目录中执行 git init&#xff0c;就可以创建一个 Git 仓库了。 注意: 没事不要手动修改 .git 目录里面的文件&#xff0c;不…

Leetcode[反转链表]

LCR 024. 反转链表 给定单链表的头节点 head &#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示…

Unity 之基于URP使用UniStorm Weather System天气系统

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity 之基于URP使用UniStorm Weather System天气系统 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、…