思维调试:为什么FormatMessage提示找不到资源?

news2025/3/1 1:33:34

在不调试的情况下解决下面的问题,说明你的思维调试能力又进阶了。

问题

我在调用 FormatMessage 函数加载一个插入的资源字符串,由于某种未知的原因,它没能按预期那样工作。
我要加载的字符串类似于这样的 “Blah blah blah %1. Blah blah blah.”
FormatMessage 调用失败了,通过 GetLastError,我得到了具体的错误代码:
ERROR_RESOURCE_TYPE_NOT_FOUND
代码如下:

>> 请移步至 www.topomel.com 以查看图片 <<

给你第一个提示:请特别注意上面代码中的 IDS_MY_CUSTOM_MESSAGE 参数。
第二个提示:”IDS_” 这个标识,你会想到什么?

以 “IDS_” 开头的资源,一般都是字符串资源,而不是消息资源标识。关于消息资源标识符的命名约定没有达成强烈的共识,尽管我曾经见过 “MSG_” 这样的资源标识前缀,部分原因是几乎没有人使用消息资源!

我不明白为什么将它们添加到 Win32 中,因为已经有一种在资源中嵌入字符串的方法,即字符串资源。

这就是你得到
ERROR_RESOURCE_TYPE_NOT_FOUND 的原因。模块中没有消息资源。如果不打算使用消息资源,则必须使用 FORMAT_MESSAGE_FROM_STRING 标志并显式传递格式字符串。

>> 请移步至 www.topomel.com 以查看图片 <<

我还对最终参数进行了轻微更改。使用
FORMAT_MESSAGE_ARGUMENT_ARRAY 时,最后一个参数必须是 DWORD_PTRs 数组。(必须将参数强制转换为 va_list* 才能使编译器满意。)

碰巧原始代码避开了这个错误,因为 sizeof(DWORD_PTR) == sizeof(LPTSTR) 并且它们都具有相同的对齐要求。
另一方面,如果插入是 DWORD,则传递 (va_list*)&dwValue 肯定是错误的,如果您运气不好,可能会崩溃。(多测试几次就知道了)

总结

有很多技术你可能一辈子都不会用到,但它确实在那里。
一小块,一小块的,将它们搞懂。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Psychic debugging: Why does FormatMessage say the resource couldn’t be found?》

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

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

相关文章

VIM编译器的安装

文章目录 前言一、VIM软件安装二、遇到问题三、VIM使用1.文档创建命令touch2.VIM编译器输入模式3.VIM编译器指令模式3.VIM编译器底行模式4.VIM编译器使用小技巧 前言 &#x1f4a6; 我们如果要在终端模式下进行文本编辑或者修改文件就可以使用 VIM 编辑器&#xff0c;VIM 编辑…

腾讯云轻量应用服务器流量用完了怎么办?

腾讯云轻量服务器流量用完了怎么办&#xff1f;超额流量另外支付流量费&#xff0c;流量价格为0.8元/GB&#xff0c;会自动扣你的腾讯云余额&#xff0c;如果你的腾讯云账号余额不足&#xff0c;那么你的轻量应用服务器会面临停机&#xff0c;停机后外网无法访问&#xff0c;继…

如何修复advapi32.dll丢失无法启动程序的问题

如果你在运行Windows程序时遇到了“advapi32.dll丢失无法启动程序”的错误消息&#xff0c;那么这意味着你的计算机缺少这个DLL文件。在本文中&#xff0c;我们将提供一些解决方案&#xff0c;帮助你解决这个问题并恢复计算机的正常运行。 一.advapi32.dll丢失电脑的提示 关于…

BUUCTF----[极客大挑战 2019]HardSQL

输入1’ 单引号闭合 进行永真式判断 竟然说我是臭弟弟----八嘎&#xff08;肯定是进行了过滤&#xff09; 经过手法判断&#xff0c;过滤了&#xff0c;空格&#xff0c;and等报错注入updatexml() 报错注入顾名思义就是&#xff0c;通过特殊函数错误使用并使其输出错误结果来获…

RLAIF(0)—— DPO(Direct Preference Optimization) 原理与代码解读

之前的系列文章&#xff1a;介绍了 RLHF 里用到 Reward Model、PPO 算法。 但是这种传统的 RLHF 算法存在以下问题&#xff1a;流程复杂&#xff0c;需要多个中间模型对超参数很敏感&#xff0c;导致模型训练的结果不稳定。 斯坦福大学提出了 DPO 算法&#xff0c;尝试解决上面…

VMware下载与安装

准备一个Linux的系统&#xff0c;成本最低的方式就是在本地安装一台虚拟机&#xff0c;VMware是业界最好用的虚拟机软件之一 官网&#xff1a;https://www.vmware.com/ 下载页面&#xff1a;https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html …

Python 3 教程(3)

958 在 Windows 下可以不写第一行注释: #!/usr/bin/python3 第一行注释标的是指向 python 的路径&#xff0c;告诉操作系统执行这个脚本的时候&#xff0c;调用 /usr/bin 下的 python 解释器。 此外还有以下形式&#xff08;推荐写法&#xff09;&#xff1a; #!/usr/bin/env p…

C# 高级特性(十一):多线程之async,await

之前使用Thread和Task启动多线程时都会遇到一个麻烦&#xff0c;就是如何反馈结果。在代码里就是如何设计回调函数。如果带界面还得考虑UI线程的问题。 而使用async&#xff0c;await可以达到两个效果。 1 不用设计回调函数&#xff0c;直接按单线程的格式写。 2 不用考虑UI…

【NR 定位】3GPP NR Positioning 5G定位标准解读(十)-增强的小区ID定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

面向对象高级编程下

面向对象高级编程下 面向对象高级编程下一. 转换函数二. non-explict-one-argument ctor三. explicit-one-argument ctor四. pointer-like classes1. 智能指针2. 迭代器 五. function-like classes六. namespace七. 模板1.类模板2.函数模板3.成员模板 八.模板特化和偏特化1. 模…

C语言——函数指针——函数指针变量详解

函数指针变量 函数指针变量的作用 函数指针变量是指向函数的指针&#xff0c;它可以用来存储函数的地址&#xff0c;并且可以通过该指针调用相应的函数。函数指针变量的作用主要有以下几个方面&#xff1a; 回调函数&#xff1a;函数指针变量可以作为参数传递给其他函数&…

CIA402协议笔记

文章目录 1、对象字典1.1 Mode of Operation&#xff08; 606 0 h 6060_h 6060h​)1.2 Modes of opration display( 606 1 h ) 6061_h) 6061h​) 2、状态机2.1 控制字&#xff08;ControlWord、6040h&#xff09;2.2 状态字&#xff08;StatusWord、6041h&#xff09;2.3 shutd…

C语言书籍——A/陷阱之处

文章参考于文献&#xff1a;《C陷阱与缺陷》[美]Andrew Koening &#x1f308;个人主页&#xff1a;慢了半拍 &#x1f525; 创作专栏&#xff1a;《史上最强算法分析》 | 《无味生》 |《史上最强C语言讲解》 | 《史上最强C练习解析》 &#x1f3c6;我的格言&#xff1a;一切只…

杨辉三角(C语言)

杨辉三角 一.什么是杨辉三角 一.什么是杨辉三角 每个数等于它上方两数之和。 每行数字左右对称&#xff0c;由1开始逐渐变大。 第n行的数字有n项。 前n行共[(1n)n]/2 个数。 … 当前行的数上一行的数上一行的前一列的数 void yanghuisanjian(int arr[][20], int n) {for (int i…

3.9Code

基于顺序存储结构的图书信息表的图书去重 #include<iostream> #include<stdlib.h> #include<string.h>typedef int status;#define OK 1using namespace std;typedef struct{char no[50];char name[50];float price; }Book;typedef struct{Book* elem;int …

Linux 学习(持续更新。。。)

wc命令 命令直接执行&#xff0c;输出包含四项&#xff0c;分别代表&#xff1a;行数、字数、字节数、文件。 例子:编译下列代码: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <fcntl.h> #inclu…

七、软考-系统架构设计师笔记-数据库设计基础知识

1、数据库基础概念 数据库基本概念 数据(Data)数据库(Database)数据库管理系统(DBMS)数据库系统(DBS) 1.数据(Data) 是数据库中存储的基本对象&#xff0c;是描述事物的符号记录。 数据的种类&#xff1a; 文本、图形、图像、音频、视频等。 2.数据库(Database, DB) 数据库…

JavaScript代码混淆与防格式化功能详解

在前端开发中&#xff0c;为了增加代码的安全性&#xff0c;防止恶意分析和逆向工程&#xff0c;有时候会采用一些防格式化的技术。这些技术主要通过混淆和难以阅读的方式来防止代码的易读性&#xff0c;提高代码的复杂度&#xff0c;增加攻击者分析的难度。 1. 代码压缩与混淆…

docker 使用官方镜像搭建 PHP 环境

一、所需环境&#xff1a; 1、PHP&#xff1a;7.4.33-fpm 的版本 2、Nginx&#xff1a;1.25.1 的版本 3、MySQL&#xff1a; 5.7 的版本 4、Redis&#xff1a;7.0 的版本 1.1、拉取官方的镜像 docker pull php:7.4.33-fpm docker pull nginx:1.25.1 docker pull mysql:5.7 do…

Character类

Character类 功能&#xff1a;实现了对 基本型数据的类包装。 构造方法&#xff1a; (char c) 常用方法&#xff1a; • public static boolean (char ch)//ch是数字字符返回true。 • public static boolean (char ch)//ch是字母返回 true。 • public static char (char c…