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

秋杰同学_4044

秋杰同学_4044

2026-04-08

324人浏览

原创

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 后把指针存起来长期使用,结果模块卸载后访问野指针。

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

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

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

C++14
C++14

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

下载
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); // 安全拷贝
</uint8_t></p>

注意: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 就静默失败。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2023.09.22

549

3

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

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

2024.03.01

1698

6

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

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

2023.12.20

320

3

typedef和define区别
typedef和define区别

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

2023.09.26

313

5

define的用法
define的用法

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

2023.10.11

619

5

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

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

2023.08.03

1798

5

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

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

2023.09.04

2844

5

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

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

2023.10.24

6164

49

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

2023.11.24

5949

6

热门下载

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

精品课程

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

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

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

共0课时 | 0人学习