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.mzph.cn/pingmian/40016.shtml

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

相关文章

Rocky Linux 9 系统OpenSSH CVE-2024-6387 漏洞修复

Rocky Linux 9系统 OpenSSH CVE-2024-6387 漏洞修复 1、漏洞修复2、修复思路3、修复方案3.1、方案一3.2、方案二 4、总结5、参考 1、漏洞修复 CVE-2024-6387&#xff1a;regreSSHion&#xff1a;OpenSSH 服务器中的远程代码执行&#xff08;RCE&#xff09;&#xff0c;至少在…

【目标检测】DINO

一、引言 论文&#xff1a; DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection 作者&#xff1a; IDEA 代码&#xff1a; DINO 注意&#xff1a; 该算法是在Deformable DETR、DAB-DETR、DN-DETR基础上的改进&#xff0c;在学习该算法前&#…

《IT 领域准新生暑期预习指南:开启未来科技之旅》

IT专业入门&#xff0c;高考假期预习指南 高考的落幕&#xff0c;只是人生长途中的一个逗号&#xff0c;对于心怀 IT 梦想的少年们&#xff0c;新的征程已然在脚下铺展。这个七月&#xff0c;当分数尘埃落定&#xff0c;你们即将迈向新的知识殿堂&#xff0c;而这个假期&#…

Git使用[推送大于100M的文件后解救办法]

推送大于100M的文件后解救办法 本文摘录于&#xff1a;https://blog.csdn.net/u012150602/article/details/122687435只是做学习备份之用&#xff0c;绝无抄袭之意&#xff0c;有疑惑请联系本人&#xff01; 当有文件大于100M的时候在提交的时候没有问题,但是在push的似乎就不行…

番外篇 | 手把手教你如何去更换YOLOv5的检测头为ASFF_Detect

前言:Hello大家好,我是小哥谈。自适应空间特征融合(ASFF)的主要原理旨在解决单次检测器中不同尺度特征的不一致性问题。具体来说,ASFF通过动态调整来自不同尺度特征金字塔层的特征贡献,确保每个检测对象的特征表示是一致且最优的。本文所做出的改进是将YOLOv5的检测头更换…

程序算法设计分析

动态规划和分治、贪心相比有什么区别&#xff1f;各自的优缺点&#xff1f; 分治算法特征&#xff1a; 1&#xff09;规模如果很小&#xff0c;则很容易解决。//一般问题都能满足 2&#xff09;大问题可以分为若干规模小的相同问题。//前提 3&#xff09;利用子问题的解&#x…

O2OA(翱途)开发平台 V9.1 即将发布,更安全、更高效、更开放

尊敬的O2OA(翱途)平台合作伙伴、用户以及亲爱的开发小伙伴们&#xff0c;O2OA(翱途)平台 V9.1将于7月3日正式发布&#xff0c;届时欢迎大家到O2OA官网部署下载及体验最新版本。新版本我们在如下方面做了更大的努力&#xff1a; 1.扩展数据库兼容性和功能范围&#xff1a;在O2OA…

基于Web技术的教育辅助系统设计与实现(SpringBoot MySQL)+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

汽车电子工程师入门系列——CAN 规范系列通读

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

使用ps给gif动图抠图

目录 导入gif图片 打开时间轴 选择图片 魔棒抠图-初步抠图 套索抠图-精准抠图 导入gif图片 打开时间轴 因为gif动图实际上多张图片实现的效果&#xff0c;所以如果要给gif抠图&#xff0c;就得挨个给每个时间线的图片抠图 点击窗口->时间轴 选择图片 在时间轴上选择要…

以 Vue 3 项目为例,多个请求下如何全局封装 Loading 的展示与关闭?其中大有学问!

大家好,我是CodeQi! 项目开发中,Loading 的展示与关闭是非常关键的用户体验设计。 当我们的应用需要发起多个异步请求时,如何有效地管理全局 Loading 状态,保证用户在等待数据加载时能有明确的反馈,这是一个值得深入探讨的问题。 本文将以 Vue 3 项目为例,详细讲解如…

eventloop 事件循环机制 (猜答案)

// eventloop 事件循环机制// console.log(555);setTimeout(() > {console.log(666);})let p new Promise((resolve,reject)>{// 同步执行console.log(111);resolve();});// promise 的回调函数是异步的微任务p.then(v > {console.log(222);}, r > {console.log(r…

STMF4学习笔记(天空星)

前言&#xff1a;本篇笔记参考嘉立创文档&#xff0c;连接放在最后 #RTC相关概念定义 Real-Time Clock 缩写 RTC 翻译 实时时钟&#xff0c;是单片机片内外设的一种&#xff0c;作用于提供准确的时间还有日期&#xff0c;这个外设有独立的电源&#xff0c;当单片机停止供电…

Java同步包装器

通过 Collections.synchronizedList() 方法将一个普通的 ArrayList 包装成了线程安全的 List&#xff1a; import java.util.*;public class SynchronizedWrapperExample {public static void main(String[] args) {// 创建一个非线程安全的 ArrayListList<String> list…

AzureDataFactory Dataverse connector自动处理了分页问题(单次查询上限5000条的限制)

众所周知&#xff0c;在用fetch执行D365的查询时&#xff0c;单次的查询是5000条&#xff0c;如果超过5000条则需要自己处理分页&#xff0c;添加额外的处理逻辑&#xff0c;但在ADF中&#xff0c;Dataverse connector已经自动处理了分页&#xff0c;我们可以很简单的做个POC. …

计算机网络——数据链路层(点对点协议PPP)

点对点协议PPP的概述 对于点对点的链路&#xff0c;目前使用得最广泛的数据链路层协议是点对点协议 PPP (Point-to-Point Protocol)。 它主要应用于两个场景&#xff1a; 用户计算机与ISP之间的链路层协议就是点对点协议 PPP&#xff0c;1999年公布了回以在以太网上运行的PPP协…

【教程】lighttpd配置端口反向代理

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 1、修改配置文件&#xff1a; sudo vim /etc/lighttpd/lighttpd.conf2、先添加mod_proxy&#xff1a; 3、然后添加端口映射&#xff1a; 4、保存&…

耗材分类功能解析:智慧校园的必备利器

在智慧校园的资产管理架构中&#xff0c;耗材分类功能是确保日常运营物资有效管理的关键组成部分&#xff0c;它致力于提高耗材使用的效率和经济性。此功能通过智能化、精细化的管理手段&#xff0c;对校园内各种易耗品进行科学分类与跟踪。 耗材分类功能首先建立在对校园日常运…

C++ 实现QT信号槽

https://github.com/libsigcplusplus/libsigcplusplus #include <iostream>/* 在sigslot.h的420,将&#xff1a; //typedef sender_set::const_iterator const_iterator; 改为&#xff1a; //typedef typename sender_set::const_iterator const_iterator;#include <…

Softing助力工业4.0 | 通过OPC UA和MQTT访问SINUMERIK 840D CNC控制器数据

Softing uaGate 840D是用于采集西门子SINUMERIK 840D SL/PL CNC控制器数据的物联网网关&#xff0c;支持OPC UA服务器和MQTT发布功能。该网关提供对SINUMERIK 840D CNC控制器机床数据的访问&#xff0c;支持读取、处理重要的主轴和从轴数据&#xff0c;例如扭矩和功耗&#xff…