【发布时间】:2013-05-22 08:59:17
【问题描述】:
我在将自定义二进制数据嵌入 Windows 可执行文件时遇到问题。问题也可能与链接资源或检索它有关,我不知道。无论如何,FindResource 返回 NULL 并且错误代码是 1814。
我发现的所有示例都包括使用某种 IDE 来创建资源和构建/制作可执行文件。我需要通过在 makefile 上调用 nmake 来自动完成。
我在 64 位 Windows 7 上使用安装在默认目录中的个人版 MS Visual Studio / C++。
这是我放在一起的设置(同一目录中的所有文件;nmake 也从该目录调用):
-
文件:custom.data.txt,其内容如下:
My own personal custom data.请注意,我仅在此示例中使用文本资源。实际上,我将使用没有特定格式的自定义数据。
-
文件:custom.h,内容如下:
#define IDR_RCDATA1 101 -
文件:custom.rc,内容如下:
IDR_RCDATA1 RCDATA "custom.data.txt"编辑:如果将 #include "custom.h" 添加到 custom.rc,则示例按预期工作:
#include "custom.h" IDR_RCDATA1 RCDATA "custom.data.txt" -
文件: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; } -
文件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 -
文件 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 thenFindResource` 会失败(就像它一样)。如果你做#include它会发生什么? -
使用包含的“custom.h”它可以完美运行。谢谢一百万,罗杰!
标签: windows binary 64-bit nmake