讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何读取资源文件中的数据 _ Windows下FindResource用法【干货】

秋杰同学_4044

秋杰同学_4044

发布时间:2026-04-08 19:54:17

|

324人浏览过

|

来源于php中文网

原创

FindResource总返回NULL的根本原因是资源类型或名称不匹配,Windows资源系统区分大小写,且自定义类型需严格按.rc文件定义使用,如MYDATA须用"MYDATA"而非"mydata"或RT_RCDATA。

c++如何读取资源文件中的数据 _ windows下findresource用法【干货】

FindResource 为什么总返回 NULL?

根本原因通常是资源类型或名称没对上,Windows 资源系统区分大小写(仅限字符串名),且默认不识别 RT_RCDATA 以外的自定义类型别名。比如你在 .rc 文件里写了 MYDATA RCDATA "data.bin",调用时必须用 MAKEINTRESOURCE(IDR_MYDATA) 或字符串 "MYDATA",但不能写成 "mydata" 或 RT_RCDATA(除非你真把它定义为 RT_RCDATA 类型)。

常见错误现象:FindResource 返回 NULL,GetLastError() 返回 ERROR_RESOURCE_NAME_NOT_FOUND 或 ERROR_RESOURCE_TYPE_NOT_FOUND。

  • 确认资源已编译进 EXE:用 Resource Hacker 或 dumpbin /resources your.exe 检查资源是否存在、类型/ID 是否匹配
  • 如果用整数 ID(如 #define IDR_DATA 101),必须用 MAKEINTRESOURCE(IDR_DATA),不能传 (LPCTSTR)IDR_DATA —— 后者会被当字符串指针解引用,大概率崩溃
  • 字符串资源名需和 .rc 中完全一致,包括空格和下划线;若含 Unicode 字符,确保 RC 编译器用了 UTF-8 或对应代码页

LoadResource + LockResource 怎么配合用才安全?

LoadResource 不会复制数据,只返回一个句柄;真正拿到内存地址要靠 LockResource。但这个“锁”只是逻辑上的,不是线程同步锁,且返回指针生命周期绑定于模块句柄——只要 DLL/EXE 没被 FreeLibrary/ExitProcess,指针就有效。

典型误用:调用 LockResource 后把指针存起来长期使用,结果模块卸载后访问野指针。

立即学习“C++免费学习笔记(深入)”;

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 永远先检查 FindResource 和 LoadResource 返回值是否非 NULL
  • LockResource 返回的是只读内存地址,不要尝试写入(即使页面可写,也违反资源语义)
  • 不需要 FreeResource —— Windows 不要求释放资源句柄,但 UnlockResource 可以显式解除锁定(实际多数场景可省略)
  • 获取大小要用 SizeofResource,别依赖 strlen 或硬编码

完整读取二进制资源的最小可靠流程

从定位到拷贝出一份可用缓冲区,四步不能少,缺一可能 crash 或读错:

HMODULE hInst = GetModuleHandle(NULL);
HRSRC hRes = FindResource(hInst, MAKEINTRESOURCE(IDR_RAWDATA), RT_RCDATA);
if (!hRes) return false;
HGLOBAL hLoaded = LoadResource(hInst, hRes);
if (!hLoaded) return false;
void* pData = LockResource(hLoaded);
if (!pData) return false;
DWORD size = SizeofResource(hInst, hRes);
<p>// 现在可以 memcpy 或直接使用 pData 指向的 size 字节
std::vector<uint8_t> buf(pData, (uint8_t*)pData + size); // 安全拷贝

注意:GetModuleHandle(NULL) 获取的是当前 EXE 模块;若资源在 DLL 中,必须传该 DLL 的 HMODULE(比如 LoadLibrary 返回值或 DllMain 的 hinstDLL)。

RC 文件定义和编译细节容易忽略什么?

资源不是“放进去就能读”,RC 编译器对语法和路径很敏感。比如相对路径在 VS 里默认相对于项目目录,但命令行 rc.exe 可能按当前工作目录解析。

  • RCData 是旧写法,推荐统一用大写 RCDATA,避免某些工具链兼容问题
  • 二进制文件路径建议用双引号包裹,尤其含空格时:IDR_CFG RCDATA "config\settings.dat"
  • 若资源过大(>1MB),链接器可能报 LNK4078: multiple resources,此时应改用 DATA 类型或分块加载
  • VS 项目中确保 .rc 文件属性 “Item Type” 是 “Resource Compile”,否则不会参与构建

资源读取本身不复杂,但每个环节都依赖前一步的精确匹配——类型、ID、模块句柄、编译路径,漏掉任一环,FindResource 就静默失败。

热门AI工具

更多
PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.12.20

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

313

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

619

2023.10.11

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1798

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2844

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn