You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中嵌入外部EXE报错1813,求解决方案

解决C++嵌入外部EXE并修复FindResourceW错误码1813的问题

错误码1813(ERROR_RESOURCE_TYPE_NOT_FOUND)的核心原因是资源定义与代码查找的参数不匹配,或者未正确嵌入资源。以下是完整实现步骤:

一、资源脚本配置(.rc文件)

Windows C++嵌入资源的标准方式是使用资源脚本(.rc文件,非你提到的.rs),这是最可靠的方案,虽非强制但几乎是唯一实用的方式。

  1. 创建resource.rc文件,内容如下:
# 定义资源ID和关联的外部EXE文件
#define IDR_EMBEDDED_EXE 100
IDR_EMBEDDED_EXE RCDATA "embed.exe"
  • IDR_EMBEDDED_EXE为自定义资源ID(数字或字符串均可,数字更不易冲突)
  • RCDATA表示该资源为二进制数据类型
  • 末尾是待嵌入的EXE文件路径(若与项目文件同目录,直接写文件名即可)
  1. 将.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 23:47:24