【问题标题】:Windows, FindResource error 1814Windows,FindResource 错误 1814
【发布时间】:2013-05-22 08:59:17
【问题描述】:

我在将自定义二进制数据嵌入 Windows 可执行文件时遇到问题。问题也可能与链接资源或检索它有关,我不知道。无论如何,FindResource 返回 NULL 并且错误代码是 1814

我发现的所有示例都包括使用某种 IDE 来创建资源和构建/制作可执行文件。我需要通过在 ma​​kefile 上调用 nmake自动完成。

我在 64 位 Windows 7 上使用安装在默认目录中的个人版 MS Visual Studio / C++

这是我放在一起的设置(同一目录中的所有文件;nmake 也从该目录调用):

  1. 文件:custom.data.txt,其内容如下:

    My own personal custom data.
    

    请注意,我仅在此示例中使用文本资源。实际上,我将使用没有特定格式的自定义数据。

  2. 文件:custom.h,内容如下:

    #define IDR_RCDATA1 101
    
  3. 文件:custom.rc,内容如下:

    IDR_RCDATA1 RCDATA "custom.data.txt"
    

    编辑:如果将 #include "custom.h" 添加到 custom.rc,则示例按预期工作:

    #include "custom.h"
    IDR_RCDATA1 RCDATA "custom.data.txt"
    
  4. 文件:example.cpp,内容如下:

    #include "custom.h"
    #include <windows.h>
    #include <fstream>
    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char* argv[]) {
    
        HRSRC myResource = FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA);
    
        if(myResource == NULL) {
            DWORD WINAPI errorCode = GetLastError();
            cout << "Could not find resource! Error code: " << errorCode << "." << endl;
            return 0;
        }
    
        unsigned int myResourceSize = SizeofResource(NULL, myResource);
        cout << "Resource size: " << myResourceSize << endl;
    
        if(myResourceSize > 0) {
    
            HGLOBAL myResourceData = LoadResource(NULL, myResource);
            void* pMyBinaryData = LockResource(myResourceData);
    
            std::ofstream f("C:\\Users\\draver\\win_custom_resource\\extracted_resource.txt", std::ios::out | std::ios::binary);
            f.write((char*)pMyBinaryData, myResourceSize);
            f.close();
    
            BOOL bResult = UnlockResource(myResource);
            bResult = FreeResource(myResource);
        }
    
        return 0;
    }
    
  5. 文件makefile,内容如下:

    NAME = example
    
    CC = "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\cl.exe"
    RC = "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\RC.exe"
    RESOURCE_NAME = custom
    
    all : link
    
    link : compile
        $(CC) $(NAME).obj $(RESOURCE_NAME).res
    
    compile : resource
        $(CC) -c $(NAME).cpp /EHsc
    
    resource :
        $(RC) $(RESOURCE_NAME).rc
    
    clean :
        del *.obj
        del *.exe
        del *.res
        del extracted_resource.txt
    
  6. 文件 setup.bat 我在 nmaking 之前调用的文件,内容如下:

    call "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64
    

生成的可执行文件 (example.exe) 包含“我自己的个人自定义数据”。字符串(通过转储验证)如预期的那样,但在运行时无法检索它。

输出是

    Could not find resource! Error code: 1814.

我做错了什么?

编辑:见上面的编辑(3.文件:custom.rc)解决了这个问题。

【问题讨论】:

  • 您的#include "custom.h" 是否在您的custom.rc 文件中?
  • 不,我没有。在我找到的所有示例中,都没有包含。此外,资源编译器在生成 .res 文件时也没有报错。
  • 你需要它,否则它不会知道IDR_RCDATA1 is 101, and then FindResource` 会失败(就像它一样)。如果你#include它会发生什么?
  • 使用包含的“custom.h”它可以完美运行。谢谢一百万,罗杰!

标签: windows binary 64-bit nmake


【解决方案1】:

(已在 cmets 中回答。见 Question with no answers, but issue solved in the comments (or extended in chat)

@Roger Rowland 写道:

您是否在 custom.rc 文件中添加了 #include "custom.h"

你需要它,否则它不会知道IDR_RCDATA1101,然后FindResource 会失败(就像它一样)。如果你这样做#include 会发生什么?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多