C++中嵌入外部EXE报错1813,求解决方案
解决C++嵌入外部EXE并修复FindResourceW错误码1813的问题
错误码1813(ERROR_RESOURCE_TYPE_NOT_FOUND)的核心原因是资源定义与代码查找的参数不匹配,或者未正确嵌入资源。以下是完整实现步骤:
一、资源脚本配置(.rc文件)
Windows C++嵌入资源的标准方式是使用资源脚本(.rc文件,非你提到的.rs),这是最可靠的方案,虽非强制但几乎是唯一实用的方式。
- 创建
resource.rc文件,内容如下:
# 定义资源ID和关联的外部EXE文件 #define IDR_EMBEDDED_EXE 100 IDR_EMBEDDED_EXE RCDATA "embed.exe"
IDR_EMBEDDED_EXE为自定义资源ID(数字或字符串均可,数字更不易冲突)RCDATA表示该资源为二进制数据类型- 末尾是待嵌入的EXE文件路径(若与项目文件同目录,直接写文件名即可)
- 将
.rc文件加入项目:- Visual Studio中直接拖入项目的「资源文件」目录
- 命令行编译(如MSVC)需包含
.rc文件:cl main.cpp resource.rc
二、修正代码中的资源查找逻辑
修改代码,确保资源ID/名称与资源脚本定义一致,同时补充资源提取逻辑:
#include <Windows.h> #include <iostream> using namespace std; // 与资源脚本中定义的ID保持一致 #define IDR_EMBEDDED_EXE 100 int main() { // 用MAKEINTRESOURCEW将数字ID转换为资源名 HRSRC resourceHandle = FindResourceW(NULL, MAKEINTRESOURCEW(IDR_EMBEDDED_EXE), RT_RCDATA); if (resourceHandle == NULL) { cout << "Resource not found! Error code: " << GetLastError() << endl; getchar(); return 1; } // 提取资源的后续步骤:获取大小、加载、锁定资源 DWORD resourceSize = SizeofResource(NULL, resourceHandle); HGLOBAL resourceData = LoadResource(NULL, resourceHandle); const void* pData = LockResource(resourceData); // 将二进制数据写入新文件完成提取 FILE* fp = fopen("extracted.exe", "wb"); if (fp) { fwrite(pData, 1, resourceSize, fp); fclose(fp); cout << "Resource extracted successfully!" << endl; } else { cout << "Failed to create file!" << endl; } getchar(); return 0; }
三、常见问题排查
- 若仍报错1813:检查资源脚本与代码中的资源ID/名称是否完全一致;确认编译时
.rc文件已被正确编译链接到可执行文件。 - 若使用字符串作为资源名:比如脚本中写
"EMBED_EXE" RCDATA "embed.exe",代码中需传入L"EMBED_EXE"作为资源名,注意大小写敏感。
内容的提问来源于stack exchange,提问作者Holzhax
相关产品推荐
相关产品推荐

