FormatMessage

用FormatMessage()函数打印Windows API出错信息 在Windows的C++编程环境中,处理API出错时的错误代码是一种常见操作。通常API函数出错时会设置Last-Error,及时调用GetLastError()函数可获得其数值,而要获取每个错误代码的具体含义,可将该错误代码传递给FormatMessage()函数,由它为我们查询系统定义的权威说明。 阅读详情
Private Const FORMAT_MESSAGE_ALLOCATE_BUFFER As Long = 256
Private Const FORMAT_MESSAGE_IGNORE_INSERTS As Long = 512
Private Const FORMAT_MESSAGE_FROM_STRING As Long = 1024
Private Const FORMAT_MESSAGE_FROM_HMODULE As Long = 2048
Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = 4096
Private Const FORMAT_MESSAGE_ARGUMENT_ARRAY As Long = 8192
Private Const FORMAT_MESSAGE_MAX_WIDTH_MASK As Long = 255
Private Const LANG_NEUTRAL As Long = &H0
Private Const SUBLANG_DEFAULT As Long = &H1

Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyW" (ByRef lpString1 As Byte, ByVal lpString2 As Long) As Long
Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageW" (ByVal dwFlags As Long, ByVal lpSource As Long, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As Long, ByVal nSize As Long, ByVal Arguments As Long) As Long
Private Declare Function LocalFree Lib "kernel32" (ByVal hMem As Any) As Long

Private Function MAKELANGID(ByVal p As Long, ByVal s As Long) As Long
    MAKELANGID = (CLng(CInt(s)) * 1024) Or CLng(CInt(p))
End Function

Private Function GetErrorText(ByVal dwErrorCode As Long) As String
    Dim dwMessageLength As Long, lpBuffer As Long
    Dim bBuffer() As Byte
    
    dwMessageLength = FormatMessage( _
        FORMAT_MESSAGE_ALLOCATE_BUFFER Or FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, _
        0, _
        dwErrorCode, _
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), _
        VarPtr(lpBuffer), _
        0, _
        0)
    If dwMessageLength = 0 Then
        GetErrorText = ""
    Else
        ReDim bBuffer(dwMessageLength + dwMessageLength + 2)
        Call lstrcpy(bBuffer(0), lpBuffer)
        GetErrorText = bBuffer
        Erase bBuffer
        Call LocalFree(lpBuffer)
    End If
End Function


 

深入理解FormatMessage API例程 Windows操作系统中的应用程序接口(API)是构建Windows软件的强大工具集,其中函数扮演着关键角色,尤其是在处理系统消息和错误代码时。该函数能够根据指定的格式化参数生成格式化的错误消息,从而为开发者提供了一种直观的方式来展示错误信息给最终用户。为了更好地利用这一功能,开发者需要深入理解的工作原理及其相关参数,以便在调试过程中快速定位问题,或在产品中为用户提供清晰的错误说明。// 示例代码:使用FormatMessage函数NULL,12345, // 示例错误代码0, 阅读详情

相关推荐

别再手动调波形了!用STM32G474的HRTIM+DAC生成精密锯齿波,附完整CubeMX配置

本文详细介绍了如何利用STM32G474的高分辨率定时器(HRTIM)和数模转换器(DAC)协同工作,实现高精度锯齿波生成。通过CubeMX配置指南、关键寄存器计算和实践技巧,帮助开发者快速掌握全硬件实现的波形生成方案,显著提升嵌入式系统的波形控制精度和响应速度。

weixin_28716769的博客 246

logback异常后发送邮件内容格式错误问题解决

问题现象:使用了logback的异常发送邮件功能,但是发送出来的邮件内容都是html代码,如下图 2. 解决思路:因为多个项目都使用了相同的异常邮件通知方案,A项目可以正常发送,B项目发出来的就是html代码。考虑下以下几种可能引起的情况,1. jar冲突 2. 邮箱服务器进行了过滤(既然A项目可以那说明不是这个问题导致的),于是去看QQ邮箱发出来的正常邮箱和html代码的显示原文邮件,发现邮件的Content-Type不一样 Content-Type: text/plain; char..

柠檬不心酸的专栏 708

2025小红书跳转卡片实战指南:从零搭建独立后台与自动化发卡系统

本文提供了一份2025年小红书跳转卡片的实战搭建指南,详细解析了独立后台系统的核心架构与自动化发卡流程。文章从零开始,手把手教你使用Node.js、Vue.js等技术栈构建包含后台管理、用户制卡中心与前端交互的完整系统,旨在帮助运营者实现合规引流,并掌握数据自主权与自动化运营能力。

weixin_29234423的博客 518

GetLastError和FormatMessage的简单使用

当调用一些Win32的函数的时候,出错的信息要通过GetLastError和FormatMessage函数来获取出错信息 DWORD dwErrorCode = ::GetLastError(); TCHAR* buffer = NULL; ::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTE...

storm_zy 一路走来 不忘初心 2867

NCBI Datasets CLI优化:解决基因组数据下载报错与速度问题

基因组数据下载是生物信息学分析的关键环节,其稳定性和效率直接影响研究进度。NCBI Datasets CLI作为官方命令行工具,常面临连接中断和下载速度慢两大痛点,这主要源于服务器连接限制和网络传输问题。通过自动重试机制和校验修复流程可提升稳定性,而连接复用与CDN加速等技术能显著提高下载效率。在植物基因组等大规模数据场景中,结合脱水模式和增量更新策略可减少70%传输量。本文以艾草基因组项目为例,展示如何通过并行下载和API优化将100个基因组的下载时间从18小时缩短至2小时,为生物信息学研究提供可靠的数据

weixin_29051245的博客 243

SAP_SD模块路径及运输功能后台配置简介

后台路径:SPRO—后勤执行—装运—基本发运功能—定义路线—定义传输模式根据实际运输过程运输地理的类型:海运、公路运输、空运后台路径:SPRO—后勤执行—装运—基本发运功能—定义路线—定义发运类型根据实际运输过程运输方式:汽车、卡车、火车、轮船、飞机后台路径:SPRO—后勤执行—装运—基本发运功能—路径—定义路线—定义运输连接点指在运输过程中需要中转的地区可以维护中转地区的停留的时间后台路径:SPRO—后勤执行—装运—基本发运功能—路径—定义路线—定义路径和阶段。

我小时候很黑的博客 1397

GetLastError()和FormatMessage()

在Win32编程时不免会出现错误,最头痛的就是不知道错哪里,为什么会错,微软同样想到这个事情,为此,提供了一个不错的函数GetLastError(),此函数可以返回上一次出错的错误代码。 比如下面这段代码: #include LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)

小龙王2010 1833

SQL注入详解

SQL注入(SQL Injection)是一种常见的Web安全漏洞,主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱库、被删除、甚至整个服务器权限陷)。 即:注入产生的原因是后台服务器接收相关参数未经过滤直接带入数据库查询...

渗透之路,攻防之间皆学问 26万+

GetLastError与FormatMessage联用得到出错原因

通常,在写WINDOWS程序的时候我们会用 GetLastError()来获得错误代号,进而想要知道具体出错原因(文本描述),我们可以用 FormatMessage 函数来得到。   下面示例一段代码。  1    2 /*   3 利用FormatMessage函数得到错误代码的文本显示。而错误代号则可由GetLastError()获得。(_WINDOWS)  4 */   5

我用CV我自豪。 983

气象大模型光伏功率预测中的应用:从短期,超短期,中长期的实现与开源代码详解

本文详细介绍了基于大模型的光伏功率预测方法,涵盖超短期(15分钟-1小时)、短期(1-6小时)和中长期(1天-1周)预测。文章首先讨论了数据准备与预处理,包括历史功率、气象、天文和电站特性数据的收集与特征工程。随后,针对不同预测需求,提出了多种深度学习模型:超短期预测采用1DCNN-LSTM混合模型,短期预测使用Transformer模型,中长期预测则通过多尺度特征提取模型和概率预测方法处理不确定性。文章还提供了模型训练、评估、部署和优化的完整流程,并开源了代码实现。未来研究方向包括结合数值天气预报、开发时

专注AI大模型,软件混淆,授权 1575

12、激光制造中人工智能与机器学习的应用及挑战

本文探讨了人工智能与机器学习在激光制造中的应用,重点分析了图像分类技术在质量检测中的多种方法及其性能对比,包括基于贝叶斯分类、卷积神经网络(CNN)和多尺度CNN的技术。同时,文章指出了AI在激光制造中面临的五大挑战:鲁棒性、安全性、可解释性、责任归属和可预测性,并提出了相应的解决思路。此外,还介绍了激光制造的主要应用技术如切割、焊接和增材制造的流程、优势与局限性,并通过对比表格直观展示不同技术的特点。最后展望了未来激光制造向智能化、自动化和可持续化发展的趋势。

rgv234567的博客 138

FormatMessage函数

我们写程序,调试出错时用的一个重要函数是 GetLastError(),它会返回一个非负数字给我们,在VS的工具--错误查找里面看相应的描述。 FormatMessage函数的功能是格式化一个消息字符串。函数需要一个消息定义(message definition)作为输入。这个消息定义可以通过一个缓冲区或一个已经加载了的消息资源表模块传入本函数。调用者还可以通过搜索系统消息资源表来传入这个消息定...

爬行的菜鸟的博客 1088

QGIS安装与使用教程

QGIS安装与使用教程

weixin_46713695的博客 2万+

FormatMessage函数的用法

使用FormatMessage时如果对一些参数不仔细研究,那么就会出错误,首先说下这个函数 1 函数描述 DWORD WINAPI FormatMessage( _In_ DWORD dwFlags, _In_opt_ LPCVOID lpSource, _In_ DWORD dwMessageId, _In_ DWORD dwLanguageI

eskimoer的专栏 2168

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

使用FormatMessage函数实现多语言消息

我们编写的程序常使用消息框来显示各类提示消息,如错误信息、确认信息等。在多语言编程中要求使用与地区语言相对应的字符文本。实现这种多语言的方法可能很多,本文介绍如何使用FormatMessage函数和消息文本,来实现多语言消息显示。

hzj58477的博客 1807

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

FormatMessage的用法

根据一个错误码返回一个错误讯息DWORD FormatMessage(    DWORD dwFlags,    LPCVOID lpSource,    DWORD dwMessageId,    DWORD dwLanguageId,    LPTSTR lpBuffer,    DWORD nSize,    va_list* Arguments    );dwFlags:# FORMA

恋一种味 2026

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

RegOpenKeyEx、RegOpenKey FormatMessage

今天读注册表时一直返回错误,使用RegOpenKeyEx返回5 失败,而RegOpenKey返回0 成功查了N多文章未果... RegOpenKeyEx说明 http://feed.yeeyan.com/articles/view/17986/4844 里面提到返回值:如果函数调用成功,返回值ERROR_SUCCESS.否则,函数将返回一个定义于Winerror.h的非

人在旅途/章鸽 的专栏 6941

c#下FormatMessage使用心得

FormatMessage API原型如下 DWORD WINAPI FormatMessage( __in DWORD dwFlags,  __in LPCVOID lpSource,  __in DWORD dwMessageId, __in DWORD dwLanguageId, __out LPTSTR lpBuff

yylooker2008的专栏 1810

FormatMessage 的用法

<br />根据一个错误码返回一个错误讯息,返回值类型为BOOL<br /><br />DWORD FormatMessage(<br />    DWORD dwFlags,<br />    LPCVOID lpSource,<br />    DWORD dwMessageId,<br />    DWORD dwLanguageId,<br />    LPTSTR lpBuffer,<br />    DWORD nSize,<br />    va_list* Arguments

skyaegean的专栏 629

FormatMessage 用法

//dwError 是 GetLastError () 返回值 CString s;  GetDlgItemText(IDC_EDIT1,s);//获取控件值 DWORD dwError = atoi(s); LPSTR lpBuffer; BOOL fok = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_I

wangping19的专栏 534
上一篇: VB.NET多线程Socket实现简单HTTP服务
下一篇: Brainfuck VM
vizee
博客等级 码龄16年 3粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值