1

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

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

我正在使用安装在默认目录中的个人版MS Visual Studio / C++在64 位 Windows 7上执行此操作。

这是我放在一起的设置(同一目录中的所有文件;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
    

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

输出是

    Could not find resource! Error code: 1814.

我究竟做错了什么?

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

4

1 回答 1

0

(已在评论中回答。请参阅没有答案的问题,但问题已在评论中解决(或在聊天中扩展)

@Roger Rowland 写道:

你有没有#include "custom.h"在你的 custom.rc 文件中?

好吧,您需要它,否则它不会知道IDR_RCDATA1is 101,然后FindResource会失败(就像它所做的那样)。如果你这样做会发生#include什么?

于 2015-01-24T15:47:15.060 回答