Windows,FindResource错误1814

时间:2013-05-22 08:59:17

标签: windows binary 64-bit nmake

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

我发现的所有示例都包括使用某种或那种IDE,用于创建资源和构建/制作可执行文件。我需要通过在 makefile 上调用 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. 我在nmaking之前调用的文件 setup.bat ,内容如下:

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

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

    输出

        Could not find resource! Error code: 1814.
    

    我做错了什么?

    编辑:请参阅上面的编辑(3.文件: custom.rc ),以解决问题。

1 个答案:

答案 0 :(得分:0)

(在评论中回答。见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会怎么样?