windows核心编程第一章:ErrorShow.cpp

Windows 核心编程笔记一:关于Error Show的总结 第一:关于代码编译的问题   第一次把ErrorShow实例从光盘上拷下来,用Microsoft Visual C++ 6.0编译,出现如下错误:Compiling...ErrorShow.cppYou are not using the latest Platform SDK header/library files. This may prevent the project from 阅读详情

windows核心编程第一章:ErrorShow.cpp

windows核心编程第一章:ErrorShow.cpp


前言

本章对错误信息的处理

DWORD GetLastError();
VOID SetLastError(DWORD dwErrCode):
如果我在自己写的程序中检测到一个错误,我可能希望向用户显示文本描述,而不是显示个干巴巴的错误编号。Windows提供了一个函数,可以将错误代码转换为相应的文本描述此函数名为FormatMessage,如下所示:

```cpp
DWORD FormatMessage
(
DWORD dwFlags,
LPCVOID pSource
DWORD dwMessageld
DWORD dwLanguageId
PTSTR pszBuffer.
DWORD nSize
va list *Arguments
)

FormatMessage的功能实际相当丰富,为了构造要向用户显示的字符串,它是首选的一种方式。之所以说它好用,一个原因是它能轻松地支持多种语言(译注:这里的语言是自然语言,比如汉语、英语等等,而不是计算机编程语言)。它能获取一个语言标识符作为参数,并返回那种语言的文本。当然,你首先必须翻译好字符串,并将翻译好的消息表(message table)资源嵌入自己的.exe 或 DLL 模块中。但在此之后,这个函数就能自动选择正确的字符串。ErrorShow 示例程序(参见后文)演示了如何调用这个函数将Microsoft 定义的错误代码编号转换为相应的文本描述。

自定义错误信息

定义的时候需要符合相关的规定,规定如下
在这里插入图片描述

ErrorShow.cpp

/******************************************************************************
01_ErrorShow.cpp
windows核心编程(2024)
windoesx.h头文件
展示了如何获取错误代码的文本描述的方法
(c)by zhangYongJiang
******************************************************************************/


#include "..\CommonFiles\CmnHdr.h"     /* 编译配置头文件 */
#include <Windowsx.h>                   //消息处理宏
#include <tchar.h>                      //通用类型
#include <winerror.h>                   //错误代码定义文件
#include "Resource.h"


///////////////////////////////////////////////////////////////////////////////

//自定义消息
#define ESM_POKECODEANDLOOKUP    (WM_USER + 100)
//const TCHAR g_szAppName[] = TEXT("Error Show");


///////////////////////////////////////////////////////////////////////////////
INT_PTR WINAPI Dlg_Proc(HWND hwnd,UINT  uMsg,WPARAM wParam,LPARAM lParam);
BOOL Dlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam);
void Dlg_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);

///////////////////////////////////////////////////////////////////////////////

//增加一个函数入口
int WINAPI _tWinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) {

    HWND hwnd = FindWindow(TEXT("#32770"), TEXT("Error Show"));
    //预防多开的代码
    if (IsWindow(hwnd)) {
        // An instance is already running, activate it and send it the new #
        //如果在运行,就激活并发送自定义的消息
        SendMessage(hwnd, ESM_POKECODEANDLOOKUP, _ttoi(pszCmdLine), 0);
    }
    else {
        DialogBoxParam(hinstExe, MAKEINTRESOURCE(IDD_ERRORSHOW),
            NULL, Dlg_Proc, _ttoi(pszCmdLine));
    }
    return(0);
}

///////////////////////////////////////////////////////////////////////////////


INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

    switch (uMsg) {
        //定义消息处理函数(宏)
        chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog);
        chHANDLE_DLGMSG(hwnd, WM_COMMAND, Dlg_OnCommand);

    case ESM_POKECODEANDLOOKUP:
        SetDlgItemInt(hwnd, IDC_ERRORCODE, (UINT)wParam, FALSE);
        FORWARD_WM_COMMAND(hwnd, IDOK, GetDlgItem(hwnd, IDOK), BN_CLICKED,
            PostMessage);//获取控件消息,送入消息队列中去
        SetForegroundWindow(hwnd);//将创建指定窗口的现场带到前台并激活窗口
        break;
    }

    return(FALSE);
}

//查阅windowsx.h定义FORWARD_WM_INITDIALOG
BOOL Dlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) {

    chSETDLGICONS(hwnd, IDI_ERRORSHOW);//添加图标

    // Don't accept error codes more than 5 digits long
    Edit_LimitText(GetDlgItem(hwnd, IDC_ERRORCODE), 5);//显示可以输入到编辑器中的数字长度
    //查看命令行传递的错误码
    // Look up the command-line passed error number
    SendMessage(hwnd, ESM_POKECODEANDLOOKUP, lParam, 0);
    return(TRUE);
}


///////////////////////////////////////////////////////////////////////////////


void Dlg_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) {
          
    switch (id) {

    case IDCANCEL:
        EndDialog(hwnd, id);
        break;

    case IDC_ALWAYSONTOP:
        //将窗口设置为最顶层
        SetWindowPos(hwnd, IsDlgButtonChecked(hwnd, IDC_ALWAYSONTOP)
            ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
        break;

    case IDC_ERRORCODE:
        //启用或禁用窗口或空间的鼠标和键盘输入
        EnableWindow(GetDlgItem(hwnd, IDOK), Edit_GetTextLength(hwndCtl) > 0);
        break;

    case IDOK:
        // Get the error code
        //获取错误代码
        DWORD dwError = GetDlgItemInt(hwnd, IDC_ERRORCODE, NULL, FALSE);

        HLOCAL hlocal = NULL;   // Buffer that gets the error message string
        //使用错误的系统语言环境,参数系统默认的语言
        // Use the default system locale since we look for Windows messages.
        // Note: this MAKELANGID combination has 0 as value
        //注意:这个MAKELANGID组合的置为0
        DWORD systemLocale = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
        //获取错误代码的文本描述,返回存储在输出缓冲区中的TCHAR数
        // Get the error code's textual description
        BOOL fOk = FormatMessage(
            FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS |
            FORMAT_MESSAGE_ALLOCATE_BUFFER,
            NULL, dwError, systemLocale,
            (PTSTR)&hlocal, 0, NULL);

        if (!fOk) {
            //是否网络相关的错误
            // Is it a network-related error?
            HMODULE hDll = LoadLibraryEx(TEXT("netmsg.dll"), NULL,
                DONT_RESOLVE_DLL_REFERENCES);

            if (hDll != NULL) {
                fOk = FormatMessage(
                    FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS |
                    FORMAT_MESSAGE_ALLOCATE_BUFFER,
                    hDll, dwError, systemLocale,
                    (PTSTR)&hlocal, 0, NULL); 
                FreeLibrary(hDll);
            }
        }

        if (fOk && (hlocal != NULL)) {
            //显示错误信息
            SetDlgItemText(hwnd, IDC_ERRORTEXT, (PCTSTR)LocalLock(hlocal));
            LocalFree(hlocal);
        }
        else {
            SetDlgItemText(hwnd, IDC_ERRORTEXT,
                TEXT("No text found for this error number."));
        }

        break;
    }
}




//////////////////////////////// End of File //////////////////////////////////



[YIUI付费插件] 超级循环列表yiuisuperscroll 本文介绍基于YIUI框架实现循环列表(LoopListView2)的完整流程:在Scroll Rect上挂载LoopListView2并配置预制体,为Item添加Click同步事件;通过ServerListPanelComponent与ServerInfoItemComponent配合,使用YIUISuperScrollListRenderer和YIUISuperScrollListOnClick实现数据渲染与点击响应,支持动态刷新列表、选中状态管理及服务器信息绑定,高效构建可交互的滚动列表界面。 阅读详情

相关推荐

深入大模型-52-Harness综述之(二)四大子系统

一个Harness都由四个子系统拼成,Agentic Loop是主干,四个子系统是Tool系统、Memory & Context、Guardrails,再加上一个把它们优雅组织起来的Skill系统。

qq_20466211的博客 13

FormatMessage

FormatMessage功能就是将GetLastError得到的错误信息(这个错误信息是数字代号)转化成字符串信息的函数 FormatMessage() 函数FormatMessage声明如下: DWORD WINAPI FormatMessage( __in DWORD dwFlags, __in_opt LPCVOID lpSource, __in DWO

pjz969的专栏 436

FPGA音频处理入门:手把手教你用Verilog实现I2S接收模块(附完整代码)

本文详细介绍了如何使用Verilog在FPGA上实现I2S接收模块,涵盖I2S协议原理、Verilog架构设计、完整代码实现及优化技巧。通过实战案例,帮助开发者快速掌握数字音频处理技术,适用于嵌入式音频系统开发。

weixin_30335575的博客 417

[笔记]Windows核心编程《十二》纤程

文章目录

二次元怪兽的博客 1071

AI智能体项目管理框架agent-pm:从原理到实战的多智能体协作指南

在人工智能和自动化技术快速发展的今天,多智能体系统已成为实现复杂任务自动化的重要技术路径。其核心原理在于通过任务分解、角色分配和状态管理,让多个AI智能体像人类团队一样协同工作,从而突破单个模型的性能边界。这种架构的技术价值在于将软件工程中成熟的项目管理方法论引入AI领域,显著提升了自动化流程的可预测性、可观测性和可复用性。在实际应用场景中,多智能体协作框架能够高效处理从代码开发、文档撰写到数据分析等一系列任务,尤其适合需要多步骤、多专业协同的复杂项目。本文聚焦的agent-pm框架,正是这一领域的典型实践

weixin_42533910的博客 714

从Bit到MCS:深度解析Xilinx FPGA程序固化流程与文件选型

本文深度解析Xilinx FPGA程序从调试到量产的固化流程,重点对比BIT、BIN、MCS和ELF四种文件格式的特性与适用场景。针对工业级应用,详细讲解MCS文件的生成优化、Flash烧录避坑指南及三级验证流程,并分享多镜像管理、加密安全等高级技巧,帮助开发者提升FPGA量产可靠性。

weixin_30924239的博客 324

FormatMessage函数的用法

FormatMessage函数   在《windows核心编程》中第一个示例便是它的使用。 这个函数我用了几次之后终于明白它的用法; 这个函数是用来格式化消息字符串,就是处理消息资源的。消息资源是由mc.exe编译的,详细请在msdn中搜索mc.exe。   先来看下它的函数原型   DWORD WINAPI FormatMessage(   __in          DW

zhao_yin的记事本 2万+

EtherCAT主站IGH-- 49 -- 搭建xenomai系统及自己的IGH主站

以上就是搭建xenomai系统及自己的IGH主站的内容。有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。创作不容,如果文档对您有帮助,记得给个赞。

常驻客栈的博客--嵌入式EtherCAT 3158

Windows 核心编程笔记一:关于Error Show的总结(转)

486

OpenOCD入门到精通:第20章 Target 子系统源码分析

摘要:本章深入分析OpenOCD Target子系统的核心实现机制。重点包括:1) 通过target_type虚函数表实现多架构抽象,支持ARM、RISC-V等30+种目标;2) ARM ADIv5协议栈实现,包含DAP/AP核心数据结构和访问机制;3) 分层架构设计,从调试接口层到传输层的完整调用链路。系统采用面向对象思想,统一管理目标状态、寄存器缓存、断点/观察点等调试要素,为上层提供标准化的调试操作接口。

从事嵌入式linux android驱动开发,拥有全栈能力 178

卸载python弹框报错:Could not set file security for file ‘D:\Config.Msi\abd5.rbf‘. Error: 5. Verify...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 6486

Windows Via C/C++ 读书笔记

《Windows Via C/C++》是微软专家Jeffery Ritcher和Christophe Nasarre合著的Windows内核编程专著。这本书也被翻译为《Windows核心编程》。总的来说这是一本名气非常大的书,由微软自己的专家编写,真正从Windows内核的角度解释如何针对系统进行编程。这本书我买了已经有些日子了,一直没怎么看,甚是浪费。这次为了纠正这个买书不读的毛病,决定开始阅读

huangxiaofei的专栏 717

蓝牙功耗优化实战:连接蓝牙耳机时高耗电问题的深度排查与解决

连接任意一款蓝牙耳机, 进行插入实网SIM卡, 同时连接蓝牙耳机后, 进入IDLE模式, 测试时间为10分钟的测试结果, 平均电流毫安在8左右. 测试结果1: 平均电流 8.84mA 测试结果2: 平均电流 7.39mA 厘清问题: 由于出现上两幅图中 绿色线圈中的 20mA 左右高耗电时段, 从而将整体的平均电流抬高. 于是在记录IDLE下电流出现绿色线圈中的 20mA 左右高耗电时段, 同时录制UART1 Catcher log. Filter: MOD_BT/MOD_ATC.

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 1001

(他山之石)MFC学习之路(三)关于编译【windows核心编程】01-ShowError 源代码出错 ,解决方法!

关于编译【windows核心编程】01-ShowError 源代码出错 ,解决方法!          ------ 已启动生成: 项目: 01-ErrorShow, 配置: Debug Win32 ------ 正在编译...  ErrorShow.cpp  c:\program files\msvc8\vc\platformsdk\include\prsht.h(531) :

QSCJOB的专栏 2205

hwasan实例分析踩内存之一:camx进程stack tag-mismatch的三种解决方案

hwasan实例分析踩内存之一:camx进程stack tag-mismatch的三种解决方案。

1291

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【数据结构-5】单链表的实现

单链表,具体来说是单向的、不带头的、不循环的链表。链表由一个一个节点组成,每个节点分为数据域和指针域,数据域存放数据,指针域存放下一节点的地址。这样,就可以根据指针域中的地址找到下一个节点,节点就串起来了构成了单链表。

weixin_44218929的博客 187

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

工厂设备接MES为什么慢:协议识别与点表配置自动化的技术拆解

工业现场设备接 MES 的周期主要消耗在协议识别与点表配置。本文拆解这条链路的四层结构,给出点表映射的数据模型、两种部署架构的对比,以及可直接落地的三项验收口径与校验代码。适合工控集成、MES 实施、设备联网方向的工程师。

emfuture的博客 388

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C# 数据结构和特殊类型

.NET Core(现称.NET)提供丰富数据结构,优化性能与开发效率。日常开发首选List<T>和Dictionary<TKey,TValue>;高性能场景推荐Span<T>与Memory<T>减少内存分配;并发环境使用ConcurrentDictionary等线程安全集合;避免非泛型集合如ArrayList。

cccloveforever的博客 674

list

的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可。是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。迭代到该位置,在这段位置上迭代需要线性的时间开销;最大的缺陷是不支持任意位置的随机访问,比如:要访问。还需要一些额外的空间,以保存每个节点的相关联信息。个元素,必须从已知的位置。

xie0510_的博客 272

向 excel、word、pdf 三种文档中占位符插入数据

【代码】向 excel、word、pdf 三种文档中占位符插入数据。

weixin_45934659的博客 56

软件商店常见问题标准处理流程

从底层软件源来看,/etc/apt/sources.list配置错误、源地址失效、公网与内网离线源混用、ARM64与x86_64架构源串用,以及DNS解析异常、系统代理配置错误,都会导致商店无法获取应用数据;打开该应用,确认可正常运行;软件商店作为系统内置的图形化软件分发与安装入口(UKUI桌面配套组件,底层依赖APT软件源),承担着应用软件的浏览、搜索、下载、安装、升级与卸载等核心功能,是终端软件部署与管理的关键通道。覆盖软件商店启动、页面加载、应用下载、安装、卸载、搜索、自身更新等全部业务场景。

qq_39496637的博客 273

【AI 开发从入门到进阶 · 10】收官篇:LoRA 微调、模型评估、推理加速与生产部署全链路

本文系统梳理了大模型微调与生产落地的全流程,从决策是否微调、优选LoRA技术方案,到代码实现、效果评估、推理加速与FastAPI服务封装,最终构建可迭代的生产级AI系统。强调“逐级升级”原则,倡导以数据闭环驱动优化,避免技术冲动。全系列贯穿工程化思维,提供可复用模板与实战建议,助力开发者从模型训练迈向稳定可用的AI服务部署。

信息安全领域优质创作者|操作系统领域专家 27

ARIA规范

ARIA用来补充原生HTML缺失的语义,原则:优先原生标签,ARIA仅做补充。 ARIA角色role:定义组件身份,分为地标角色、构件角色、文档角色;构件角色用于自定义弹窗、tab、下拉菜单等复杂组件; ARIA状态与属性:以aria-开头,描述组件实时状态;常用:aria-label、aria-labelledby、aria-describedby、aria-hidden、aria-expanded、aria-selected、aria-modal、aria-live; 常用场景:图标按钮用aria-l

2401_83227843的博客 407

LangGraph 的分离思想总结

LangGraph 的分离思想,本质上是对"高内聚、低耦合"这一经典工程原则在 LLM 应用领域的落地。它通过状态与逻辑分离、节点职责分离、控制流与执行分离、计算与持久化分离、编排与实现分离五个层面,把一个难以维护的"大黑盒"拆解成一组可组合、可测试、可观测的部件。理解这套分离思想,比记住 API 更重要——因为当你面对新的智能体场景时,真正指导你做出合理拆分的,正是这些分离原则。

张晨光老师的播客 373

[C++]:7.STL:list

好久不见,firdawn小课堂又和大家见面啦。今天我们要学习的内容是list容器,list也是一种常用的数据结构。下面是本章的思维导图,那么让我们开始学习吧!自定义的list,由三个结构构成。分别是链表的最小组成单位,也就是链表节点。以及迭代器类和list类其实要特别说明的是, List的迭代器,它不是单纯的指针,因为我们如果对指针直接进行解引用操作的话,我们得到的是这个节点,而不是节点里面存储的值并且我们对这个指针加加,得到的也不是下一个节点的地址,而是所在节点的下一个单位的地址。

2301_80817679的博客 186

Java基础:泛型、类型擦除与 PECS 原则

泛型允许类、接口和方法使用类型参数,把许多类型检查提前到编译期,减少显式类型转换,提高代码复用性。例如。

cjpabc的博客 444
上一篇: c++ primer plus 第16章string 类和标准模板库,string 类输入
下一篇: c++ primer plus 第16章string 类和标准模板库,16.1.3 使用字符串
zhyjhacker
博客等级 码龄17年 3203粉丝 406原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值