c++如何读取资源文件_将数据嵌入到exe内部读取【技巧】

千晨吖_2082

千晨吖_2082

2026-04-14

499人浏览

原创

Windows下读取嵌入二进制资源的可靠方式是:将文件作为自定义资源(如RCDATA)编译进EXE,再依序调用FindResource→LoadResource→LockResource获取指针,并用SizeofResource获取真实大小;RC文件需正确定义类型与ID,CMake中须启用RC语言并纳入构建。

c++如何读取资源文件_将数据嵌入到exe内部读取【技巧】

Windows平台下用FindResource + LoadResource读取嵌入的二进制资源

直接结论:C++ 本身不提供跨平台资源嵌入机制,Windows 下最可靠的方式是把文件作为自定义资源编译进 EXE,再用 Win32 API 加载。这比运行时读取外部文件更安全、更紧凑,也避免路径错误。

关键不是“怎么写代码”,而是“怎么让资源真正进到 EXE 里”——很多人卡在 RC 文件没配对、资源 ID 类型不匹配、或加载后忘了锁定内存。

  • RC 文件中必须声明资源类型(如 MYDATA RCDATA "data.bin"),类型名不能含空格或点;若用字符串类型(如 "BIN"),加载时 FindResource 第二个参数得传 MAKEINTRESOURCE 或对应字符串
  • 资源加载三步不能少:FindResource → LoadResource → LockResource;漏掉 LockResource 会拿到无效指针
  • 资源大小要用 SizeofResource 获取,别靠 strlen 或硬编码——二进制数据可能含 \0
HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(IDR_MYDATA), _T("RCDATA"));
HGLOBAL hLoaded = LoadResource(NULL, hRes);
void* pData = LockResource(hLoaded);
DWORD size = SizeofResource(NULL, hRes); // 注意:不是 GlobalSize(hLoaded)

如何在 CMake 中自动编译 RC 文件并链接到可执行文件

VS GUI 项目默认支持 .rc,但 CMake 需手动配置,否则资源根本不会进最终 EXE。常见错误是只加了 add_executable 却没告诉链接器处理资源目标。

  • 确保 .rc 文件被列为源文件之一:add_executable(myapp main.cpp myapp.rc)
  • Windows 下需启用 ENABLE_LANGUAGE(RC)(CMake 3.8+),否则 .rc 被忽略
  • 若用 MinGW 工具链,需额外指定 set(CMAKE_RC_COMPILER "windres"),且 .rc 中路径要用正斜杠或双反斜杠
  • 资源 ID(如 IDR_MYDATA)必须在 resource.h 中正确定义为整数,不能是字符串字面量

读取字符串资源时为何LoadString比手动解析更稳妥

如果嵌入的是纯文本(如 JSON、INI、多语言字符串),别自己用 FindResource 拿原始内存再转 std::string——容易因编码、换行符、BOM 处理出错。Windows 提供了专用于字符串资源的机制。

C++14
C++14

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

下载
  • LoadString 自动处理 Unicode 转换(根据模块是否 Unicode 编译)、截断保护、空终止,且支持多语言资源节切换
  • RC 文件中应使用 STRINGTABLE 块,而非 RCDATA;例如:BEGIN "Hello World\0" END
  • 调用时传入缓冲区长度(字符数,非字节数),返回值是实际复制的字符数;返回 0 表示失败(检查 GetLastError)
TCHAR buf[256];
int len = LoadString(hInstance, IDS_WELCOME, buf, _countof(buf));
if (len > 0) {
    std::wstring str(buf, len);
}

跨平台替代方案:为什么xxd -i生成 C 数组仍是实用底线

Linux/macOS 没有资源系统,Windows 上若想保持构建脚本统一,或团队不熟悉 RC 流程,用 xxd -i 把文件转成 C 数组头文件是最轻量、最可控的 fallback 方案。

  • xxd -i data.bin > data_bin.h 生成类似 unsigned char data_bin[] = {0x48, 0x65, ...}; 的内容
  • 在 C++ 中 #include "data_bin.h" 后,可用 std::span(data_bin, data_bin_len) 安全访问
  • 缺点:每次资源变更都要重新运行 xxd;优点:无平台依赖、调试直观、IDE 可跳转查看原始字节
  • 注意:xxd 默认生成 C90 兼容代码,数组名含点号会报错,可用 -n 指定合法标识符名,如 xxd -n data_bin -i

真正麻烦的从来不是“怎么读”,而是资源更新后忘记重新编译 RC 或重跑 xxd;CI 环境里尤其要检查构建日志里有没有 rc.exe 错误或 xxd 未执行告警。

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

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

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

下载

相关标签:

c++

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

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2275

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3722

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1236

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

4299

7

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

7259

3

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

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

2023.12.20

320

3

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.12.04

17300

5

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

1223

5

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

2025.06.11

9350

9

热门下载

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

精品课程

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

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

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

共0课时 | 0人学习